一个语法的问提?

Tesiro 2009-03-06 10:00:27
写了一个测试程序, 但编译不能通过, 请高手指教, 谢谢:
//.h

template <typename T1, typename T2>
class CDemo
{[code=C/C++]

public:
typedef CDemo* PDEMO;

public:
PDEMO __stdcall Fun();
};
[/code]

//.cpp

template <typename T1, typename T2>
STDMETHODIMP_(typename CDemo<T1, T2>::PDEMO) CDemo<T1, T2>::Fun()
{
wcout << TEXT("Fun") << endl;
return NULL;
}


// .cpp

int _tmain(int argc, _TCHAR* argv[])
{
CDemo<int, int> demo;
demo.Fun();
return 0;
}


...全文
157 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
zwvista 2009-03-13
  • 打赏
  • 举报
回复
宏是通过预处理器来展开的。预处理器的分析在词法语法分析之前,它根本不知道typename CDemo<T1, T2>::PDEMO的含义,它只认逗号。
因此STDMETHODIMP_(typename CDemo<T1, T2>::PDEMO)被分析成了带两个参数的宏,一个参数是"typename CDemo<T1",另一个参数是"T2>::PDEMO",于是预处理出错。
Tesiro 2009-03-07
  • 打赏
  • 举报
回复
如果是这个逗号的问题, 那这是为什么呢?
sagegz 2009-03-06
  • 打赏
  • 举报
回复
模版函数的声明和定义应该同在.h文件中.
xuguod20042576 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 lightnut 的回复:]
引用 9 楼 Tesiro 的回复:
问题就是在STDMETHODIMP_()宏, 不明白为什么不能接受typename CDemo <T1, T2>::PDEMO做为参数?

STDMETHODIMP_的定义:
#define STDMETHODIMP_(type) type STDMETHODCALLTYPE
使用STDMETHODIMP_(x)时, x中不能有","
[/Quote]
up
lightnut 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 Tesiro 的回复:]
问题就是在STDMETHODIMP_()宏, 不明白为什么不能接受typename CDemo <T1, T2>::PDEMO做为参数?
[/Quote]
STDMETHODIMP_的定义:
#define STDMETHODIMP_(type) type STDMETHODCALLTYPE
使用STDMETHODIMP_(x)时, x中不能有","
TplayT 2009-03-06
  • 打赏
  • 举报
回复
up
fairchild811 2009-03-06
  • 打赏
  • 举报
回复
定义放到.h中

另外宏中有 ,
shexinwei 2009-03-06
  • 打赏
  • 举报
回复
UP!!
zwvista 2009-03-06
  • 打赏
  • 举报
回复
关键不在于参数复杂,而在于逗号
typename CDemo <T1, T2>::PDEMO 当中就有一个逗号
nemo_song 2009-03-06
  • 打赏
  • 举报
回复
学习.
arong1234 2009-03-06
  • 打赏
  • 举报
回复
有些东西实现的时候做了一些约束使得编译器实现更简单,这没有什么奇怪的:)
[Quote=引用 9 楼 Tesiro 的回复:]
问题就是在STDMETHODIMP_()宏, 不明白为什么不能接受typename CDemo <T1, T2>::PDEMO做为参数?
[/Quote]
lingyin55 2009-03-06
  • 打赏
  • 举报
回复
这个应该是STDMETHODIMP_宏的问题,如3楼所说,它不允许接收这么复杂的参数

[Quote=引用 9 楼 Tesiro 的回复:]
问题就是在STDMETHODIMP_()宏, 不明白为什么不能接受typename CDemo <T1, T2>::PDEMO做为参数?
[/Quote]
genius_tong 2009-03-06
  • 打赏
  • 举报
回复
UP~~
xuruichen 2009-03-06
  • 打赏
  • 举报
回复
模板函数不能放在CPP中,必须放在H文件中
Tesiro 2009-03-06
  • 打赏
  • 举报
回复
问题就是在STDMETHODIMP_()宏, 不明白为什么不能接受typename CDemo<T1, T2>::PDEMO做为参数?
Tesiro 2009-03-06
  • 打赏
  • 举报
回复
如果把程序稍做修改就可以编译成功, 修改如下:

template <typename T1, typename T2>
//STDMETHODIMP_(typename CDemo<T1, T2>::PDEMO) CDemo<T1, T2>::Fun()
typename CDemo<T1, T2>::PDEMO __stdcall CDemo<T1, T2>::Fun()
{
wcout << TEXT("Fun") << endl;
return NULL;
}



编译环境VS2005
zsf81 2009-03-06
  • 打赏
  • 举报
回复
MARK
  • 打赏
  • 举报
回复
模板的声明跟定义都放在.h文件里.
或者可以用export关键字(如果你的编译器支持的话)
http://topic.csdn.net/u/20090302/18/4320513c-c749-42bd-8922-b96c00b5a2b4.html?seed=888949324
参看79楼
lingyin55 2009-03-06
  • 打赏
  • 举报
回复
如果要把模板函数的实现放在cpp文件中,就要把cpp文件包含在调用该模板函数的文件。
lingyin55 2009-03-06
  • 打赏
  • 举报
回复
VC6不支持模板函数在cpp文件中的实现,可以把其实现放在头文件中,但不一定放在定义类的头文件中,可以放在独立的头文件中。
加载更多回复(3)

64,646

社区成员

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

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