最近使用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++的书里都有.但是容易被人忽略.
后来,程序需要在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++的书里都有.但是容易被人忽略.