用宏定义类的问题

bigtankbigtank 2009-03-18 11:20:51
//MacroDefClass.h
#ifndef MACRO_DEF_CLASS_H_
#define MACRO_DEF_CLASS_H_

#define CAT_TWO_SYMBOL1(x,y) x##y
#define CAT_TWO_SYMBOL(x,y) CAT_TWO_SYMBOL1(x,y)

#define CNORMAL_DEF(Postfix) \
class CAT_TWO_SYMBOL(CNormal,Postfix){\
public:\
void fn(void);\
};\
inline void CAT_TWO_SYMBOL(CNormal,Postfix)::fn(void){\
}

//宏定义CNORMAL_DEF(Postfix)合法,但:

#define CTEMPLATE_DEF(Postfix) \
template<typename T> \
class CAT_TWO_SYMBOL(CTemplate,Postfix){ \
public: \
void fn(void); \
}; \
template<typename T> \
void CAT_TWO_SYMBOL(CTemplate,Postfix)<T>::fn(void){ \ //编译器错误定位在此行
};

//报错:
//error C2143: syntax error : missing ';' before '<'
//error C2182: 'CTemplatePostfix' : illegal use of type 'void'
//error C2988: unrecognizable template declaration/definition
//error C2059: syntax error : '<'
//error C2039: 'fn' : is not a member of '`global namespace''

#endif

//请问大家为什么定义类模板时出错,如何改正?
...全文
182 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
奇怪,难道又是VC6的问题咯?
liliangbao 2009-03-19
  • 打赏
  • 举报
回复
编译没有问题!
void CAT_TWO_SYMBOL(CTemplate,Postfix) <T>::fn(void){ \ //编译器错误定位在此行
};

末尾的;应去掉,同时该宏不能用于函数内部,只能用于函数外部!
bigtankbigtank 2009-03-19
  • 打赏
  • 举报
回复
问题解决了。
Itc_mouse贴出的代码与我自己的代码分别拷贝到两个记事本中,用程序将二者的内容读到内存中,一个字符一个字符的比较,发现我的代码在第一个template<typename T> \后面也就是斜杠后面多出来一个制表符,将其删除就可以了。
谢谢各位。
另外,我用的是vc2005。
sagegz 2009-03-19
  • 打赏
  • 举报
回复
又是VC6.0吧?
ltc_mouse 2009-03-18
  • 打赏
  • 举报
回复
试着编译了下,没有报错呀
VS2003


#define CAT_TWO_SYMBOL1(x,y) x##y
#define CAT_TWO_SYMBOL(x,y) CAT_TWO_SYMBOL1(x,y)

#define CNORMAL_DEF(Postfix) \
class CAT_TWO_SYMBOL(CNormal,Postfix){\
public:\
void fn(void);\
};\
inline void CAT_TWO_SYMBOL(CNormal,Postfix)::fn(void){\
}

//宏定义CNORMAL_DEF(Postfix)合法,但:

#define CTEMPLATE_DEF(Postfix) \
template <typename T> \
class CAT_TWO_SYMBOL(CTemplate,Postfix){ \
public: \
void fn(void); \
}; \
template <typename T> \
void CAT_TWO_SYMBOL(CTemplate,Postfix) <T>::fn(void){ \
}


CTEMPLATE_DEF(Test)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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