关闭

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

3254人阅读 评论(1) 收藏 举报
最近使用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++的书里都有.但是容易被人忽略.
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:971335次
    • 积分:13138
    • 等级:
    • 排名:第1082名
    • 原创:248篇
    • 转载:31篇
    • 译文:0篇
    • 评论:784条
    最新评论