难道是vs2005编译器的bug?

chiny 2006-10-11 12:17:06
//declarition
template <typename T>
class M
{
public:
void hello();
};
//definition
template <typename T>
void M<T>::hello()
{
cout << "Hello,M!" <<endl;
}

//invoking
int _tmain(int argc, _TCHAR* argv[])
{
M<int> m;
m.hello();
return 0;
}


没有问题。

现在把declarition 和definition分别放到m.h和m.cpp,然后编译,总是提示:

lifesting.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall M<int>::hello(void)" (?hello@?$M@H@@QAEXXZ),该符号在函数 _wmain 中被引用

意思大概是找不到定义。

怎么回事?谢谢。
...全文
3710 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
dgcergo 2006-10-13
  • 打赏
  • 举报
回复
c++的模板其实很类似宏,就是个编译时,由编译器生成填充了实际类型的类型源代码,然后再将扩展后的源码编译成2进制机器码。
要实现发布范型组件(包含范型类型的dll,exe),就不能发行本地代码,可以使用对应.NetFramework2.0的IL程序集或者最新的支持范型的java,但是java的范型组建并不包含特定类型信息。
guanpeng615 2006-10-13
  • 打赏
  • 举报
回复
//M.h
template <typename T>
class M
{
public:
void hello();
};

//M.cpp
#include "M.h"
#include <iostream>

template <typename T>
void M<T>::hello()
{
std::cout << "Hello,M!" << std::endl;
}

//main.cpp
#include "M.cpp"
int main()
{
M<int> m;
m.hello();
return 0;
}

这下应该没问题了, 再试一试吧^_^
zeusever 2006-10-13
  • 打赏
  • 举报
回复
这个特性符合c++标准但是由于它实现的难度太大,所以几乎没有一家商业c++编译器实现过这个特性,《c++ excpetional style》 上有介绍
jypp 2006-10-12
  • 打赏
  • 举报
回复
把模板的实现声明为export的试试
broccoli 2006-10-12
  • 打赏
  • 举报
回复
MARK
lrh3025 2006-10-12
  • 打赏
  • 举报
回复
VC不支持模板定义与实现在不同文件中,必须在.h文件中。
此外,像inline函数,C++标准中是可以定义在.cpp文件中的,但是VC中也是不可以的
Cnwanglin 2006-10-11
  • 打赏
  • 举报
回复
要把m.cpp添加到工程中

lw1a2 2006-10-11
  • 打赏
  • 举报
回复
我曾经提问找支持分离编译模式的编译器

忘了有谁说Intel C++了,我没有试
OOPhaisky 2006-10-11
  • 打赏
  • 举报
回复
模板编译模式问题。
模板有两种编译模式:分离编译模式和包含编译模式。

包含编译模式:类模板所有成员函数的定义全部放在头文件中。
分离编译模式:类模板定义放在头文件中,成员函数的定义放在cpp文件中(需要关键字export)。

目前大多数c++编译器都只支持模板包含编译模式,而不支持模板分离编译模式。vs也不支持模板分离编译模式。

ps:其实,模板分离编译模式并没有[普通函数分离编译]那样的优秀,楼主可以参考《exceptional c++ style》第9、10条款,里面解释的很详细:)
adintr 2006-10-11
  • 打赏
  • 举报
回复
不会
chiny 2006-10-11
  • 打赏
  • 举报
回复
谢谢大家,我查了好像intel c++支持export分离模板编译,它支持vs 2005,那样会不会就支持
dll内包含template了呢?
adintr 2006-10-11
  • 打赏
  • 举报
回复
内部随便用,但编译到 dll 中的都是实例化之后的代码,模板只存在于编译期
sinall 2006-10-11
  • 打赏
  • 举报
回复
我确实不知道dll内部不能使用模板,我处于学习阶段。
——呵呵,为什么不能用?难道所有的dll内部都没有用STL?
chiny 2006-10-11
  • 打赏
  • 举报
回复
我确实不知道dll内部不能使用模板,我处于学习阶段。
sinall 2006-10-11
  • 打赏
  • 举报
回复
呵呵,sinall,dll还能包装模板?说走嘴了吧。
——dll内部不能使用模板???
taodm 2006-10-11
  • 打赏
  • 举报
回复
呵呵,sinall,dll还能包装模板?说走嘴了吧。
sinall 2006-10-11
  • 打赏
  • 举报
回复
如果我只能给别人一个包含模板的接口头文件,实现在另外的dll中,是不是就没有办法来做了?
——————————————————————————————————————————
就我所知,“模板头文件 + cpp文件”不行,那么“模板头文件 + dll文件”就更不行了。
解决方案
1)只提供“模板头文件”
2)提供“普通头文件 + dll文件(其中包装你的模板)”
Jim_King_2000 2006-10-11
  • 打赏
  • 举报
回复
模版的实现好像不能放在dll中吧?据我所知模版目前为止还是基于souce code的,还没有到二进制的地步,因为不知道数据类型就不知道分配多大空间。
chiny 2006-10-11
  • 打赏
  • 举报
回复
如果我只能给别人一个包含模板的接口头文件,实现在另外的dll中,是不是就没有办法来做了?
Dugowe 2006-10-11
  • 打赏
  • 举报
回复
模板编译模式分为包含模式(在头文件中定义)和分离模式(.cpp文件中定义), vs2005 不支持分离模式, 据我所知,现在没有几个编译器支持这个...
加载更多回复(9)

64,651

社区成员

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

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