熟悉C++和template的同仁请进,看看我的代码哪里有错。

lanzhengpeng2 2002-05-16 07:54:46
下面是我一段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
...全文
44 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lanzhengpeng2 2002-05-16
  • 打赏
  • 举报
回复
看来只好要求改了。
蚊子王 2002-05-16
  • 打赏
  • 举报
回复
好象比较困难,对VC来说
lanzhengpeng2 2002-05-16
  • 打赏
  • 举报
回复
在g++下能编译通过,可是。。。我不能使用g++ :<
lanzhengpeng2 2002-05-16
  • 打赏
  • 举报
回复
另外,没有default constructor
lanzhengpeng2 2002-05-16
  • 打赏
  • 举报
回复
多谢各位的指导。问题是,在那个该死的系统中,CRTTI<T,...>中有两个关键的函数是这样定义的:
private:
CRTTI(const CRTTI & ref);
CRTTI<T,...> & operator = (const CRTTI & ref);
并且是没有实现函数的。
这样做的目的想必各位C++高人都明白,而且不是我说改就能改的。
(...表示有更多参数省略)
xwu 2002-05-16
  • 打赏
  • 举报
回复

template<class T,int id>
CRTTI< CA<T,id> > CA<T,id>::sm_RTTI(id);
改成看看
template<class T,int id>
CRTTI< CA<T,id> > CA<T,id>::sm_RTTI = CRTTI< CA<T,id> >id;

VC6 下通过编译。

chaisave 2002-05-16
  • 打赏
  • 举报
回复
MSVC是错的,它把sm_RTTI当作一个CA<T,id>的成员函数了。
template<class T,int id>
CRTTI< CA<T,id> > CA<T,id>::sm_RTTI(id);
我也碰到过这种情况。

template<class T,int id>
CRTTI< CA<T,id> > CA<T,id>::sm_RTTI(id);
改成:
template<class T,int id>
CRTTI< CA<T,id> > CA<T,id>::sm_RTTI = CRTTI< CA<T,id> >(id);
就可以了。
lanzhengpeng2 2002-05-16
  • 打赏
  • 举报
回复
不行的,因为在实际情况中是这样的:
1、sm_RTTI的参数不只一个
2、class CRTTI的拷贝构造函数和operator=都是私有的并且是没有实现的。
蚊子王 2002-05-16
  • 打赏
  • 举报
回复

template<class T,int id>
CRTTI< CA<T,id> > CA<T,id>::sm_RTTI(id);
改成看看
template<class T,int id>
CRTTI< CA<T,id> > CA<T,id>::sm_RTTI=id;

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧