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

最近使用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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值