熟悉C++和template的同仁请进,看看我的代码哪里有错。
下面是我一段RTTI的简化版本,在VC6+SP5上编译通不过。但是我的经验告诉我,应该没有错的。请各位指点指点是为什么编译通不过。如果是平台差异,请告诉我在VC6下其他折中的方法。谢谢
#include <iostream>
using namespace std;
template<class T>
class CRTTI
{
public:
int m_ID;
CRTTI(int id)
:m_ID(id)
{
}
T * CreateObj()
{
return new T;
}
};
template<class T,int id>
class CA
{
public:
T m_t;
static CRTTI< CA<T,id> > sm_RTTI;
};
template<class T,int id>
CRTTI< CA<T,id> > CA<T,id>::sm_RTTI(id);
int main(int argc, char* argv[])
{
CA<int,1> * p = CA<int,1>::sm_RTTI.CreateObj();
p->m_t = 100;
cout << p->m_t;
cin >> p->m_t;
}
下面是VC的出错信息:
E:\TX\TestDX3D\testCamera\ClassID\ClassID.cpp(33) : error C2061: syntax error : identifier 'id'
E:\TX\TestDX3D\testCamera\ClassID\ClassID.cpp(33) : error C2063: 'sm_RTTI' : not a function
E:\TX\TestDX3D\testCamera\ClassID\ClassID.cpp(33) : error C2040: 'sm_RTTI' : 'class CRTTI<class CA<T,`template-parameter258'> > (void)' differs in levels of indirection from 'class CRTTI<class CA<T,`template-parameter258'> >'
E:\TX\TestDX3D\testCamera\ClassID\ClassID.cpp(37) : error C2039: 'sm_RTTI' : is not a member of 'CA<int,1>'
E:\TX\TestDX3D\testCamera\ClassID\ClassID.cpp(37) : error C2065: 'sm_RTTI' : undeclared identifier
E:\TX\TestDX3D\testCamera\ClassID\ClassID.cpp(37) : error C2228: left of '.CreateObj' must have class/struct/union type
E:\TX\TestDX3D\testCamera\ClassID\ClassID.cpp(38) : error C2027: use of undefined type 'CA<int,1>'
E:\TX\TestDX3D\testCamera\ClassID\ClassID.cpp(38) : error C2227: left of '->m_t' must point to class/struct/union
E:\TX\TestDX3D\testCamera\ClassID\ClassID.cpp(39) : error C2027: use of undefined type 'CA<int,1>'
E:\TX\TestDX3D\testCamera\ClassID\ClassID.cpp(39) : error C2227: left of '->m_t' must point to class/struct/union
E:\TX\TestDX3D\testCamera\ClassID\ClassID.cpp(41) : error C2027: use of undefined type 'CA<int,1>'
E:\TX\TestDX3D\testCamera\ClassID\ClassID.cpp(41) : error C2227: left of '->m_t' must point to class/struct/union
E:\TX\TestDX3D\testCamera\ClassID\ClassID.cpp(42) : warning C4508: 'main' : function should return a value; 'void' return type assumed