C++ template 语法需要注意的问题!

原创 2006年06月19日 21:15:00
最近使用C++ template不是很多. 却需要在多个编译器上进行编译. 开发的时候我的开发环境为Visual Studio 2005. 编译当然是vc++2005了.编译我的几个模板没有出现过问题.
后来,程序需要在g++多个版本下编译. g++3.x的没有问题.但是到了g++-4.0下却出现多个恶心的编译错误.现在一一列出,希望给后来者提供些线索.
1. template class friend 的问题.
 很多时候,一个模板我们希望能用typedef来包装过.
比如我的ResourceManager和HResource两个模板类.ResourceManager要使用HResource模板类中的protected成员.那么如下是一种很自然的定义方式:
template <typename T> class HResource
{
       typedef ResourceManager<T> MyResMgr;
       friend class MyResMgr;
 public:
};
这样在大多数编译器上能工作的上. 但是换到g++-4.0就会报错.我们必须规规矩矩的写成:
template <typename T> class HResource
{
       typedef ResourceManager<T> MyResMgr;
       friend class ResourceManager<T>;
 public:
};
实在有够变态.....!

2: template的派生类使用成员变量
template <typename T> class TBase
{
    protected:
       int m_Size;
};
template <typename T> class TDerived : public TBase<T>
{
    void foo()
   {
         m_Size = 0 ; // 在g++4.0报告找不到变量的定义.
         this->m_Size; //正确
         TBase<T>::m_Size; //正确
   }
};

3: template派生后的静态成员变量问题

/*singleton.h*/
template <typename T> class CSingleton
{
protected:
    static T* ms_pSingleton;
};

/*somefile.cpp*/

CSomeClass* CSingleton<CSomeClass>::ms_pSingleton = NULL;//g++-4.0报告模板参数错误

正确的写法为
/*somefile.cpp*/
template<> CSomeClass* CSingleton<CSomeClass>::ms_pSingleton = NULL;

或者在/*singleton.h*/写成这样在
/*singleton.h*/
template <typename T> class CSingleton
{
protected:
    static T* ms_pSingleton;
};
template <typename T> T* CSingleton<T>::ms_pSingleton = NULL;
这样CPP文件里就不用再写了.
我比较推荐前一种方式. 但是后一种省力一些.


以上为最近发现的问题,这些在C++的书里都有.但是容易被人忽略.

C++ - 函数模板(function template) 的 推进(forward) 问题 及 解决

函数模板(function template) 的 推进(forward) 问题 及 解决 本文地址: http://blog.csdn.net/caroline_wendy/article/de...

C++之模板类(Template) 容器之map 及 对象副本 深/浅拷贝 等问题

 一般地当我们只想知道一个值是否存在时,set 最有用处;希望存储也可能修改一个相关的值时,map 最为有用.    map提供一个键值对容器,在map(也叫关联数组)中我们提供一个键/值对,...

C++ template 问题

今天在http://bbs.51cto.com/viewthread.php?tid=854253&pid=4320845&page=1&extra=#pid4320845看到了一个关于C++temp...

C++Template头文件和定义分开编译的问题

(1) // Foo.h template class Foo { public: void f(); }; // Foo.cpp #include #include "Fo...

c++ 模板 迭代器 使用问题解决方法(too few template-parameter-lists)

迭代器编译不通过 test.cc:53: error: ‘iter’ was not declared in this scope

重学C++Primer笔记5---一些基本语法需要特别注意的地方

对于熟练C或者C++的人来说,熟读和熟记并理解下面的内容是有很大的帮助的,要在实践中好好去体会和实现下面的要点。以此作为笔记,不厌其烦的去理解,好好学习。 内置类型的存储空间依机器而定,当规定了每个算...
  • FreeApe
  • FreeApe
  • 2015年09月18日 21:39
  • 845

DLL中建立进程共享数据段需要注意的语法问题

默认情况下,所有的数据段都是进程独立的,每个进程有自己的一份。但有时候进程共享一个数据段也是有需要的,为此VC++编译连接器提供了专门的语法,下面是一个典型的例子,建立了一个名为Shared的共享数据...
  • smstong
  • smstong
  • 2015年01月02日 17:56
  • 2434

Wap2.0开发语法及注意问题

  • 2011年07月23日 16:44
  • 55KB
  • 下载

jetbrick-template语法格式

  • 2017年06月23日 16:58
  • 3KB
  • 下载

C++,字符数组,赋值问题,语法练习

相关知识点 : C++ Prime  P35,P97,P113      #include #include using namespace std; void main() { ...
  • sergery
  • sergery
  • 2012年10月08日 00:29
  • 3845
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ template 语法需要注意的问题!
举报原因:
原因补充:

(最多只允许输入30个字)