C++-C++模板声明和定义为什么必须放在一起
C++的模板定义和声明必须放在一个文件中,如果我把声明放在一个.h文件中,定义放在另一个.cpp中,便无法通过编译。比如VS2008.
这是为什么呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
C++的模板定义和声明必须放在一个文件中,如果我把声明放在一个.h文件中,定义放在另一个.cpp中,便无法通过编译。比如VS2008.
这是为什么呢?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(2)
可以分开放,但是要在头文件之后包含相应的实现文件,这是一种方法,叫做包含编译模型(inclusion compilation model)
还有一种是使用export关键字,叫做分别编译模型(separate compilation model)
,不过只有少数的编译器实现这种模型。我用的g++ 4.6.3不支持!
c++ primer有两种编译模型的详细讲解。
模板类似宏的实现,在代码编译的时候,遇到模板申明就生成对应的模板类和方法(新的一个类),如果申明和定义是分开的,在编译的时候是对的,因为找到了相应的定义,但在链接的时候cpp和.h文件是分开的生成的函数式不同的,所以会链接错误。
ex:
Foo.h
template<typename T>
class Foo {
public:
Foo();
void DoSomeThing(T x);
private:
T x;
};
Foo.cpp
template<typename T>
Foo<T>::Foo()
{
...
}
template<typename T>
void Foo<T>::DoSomeThing(T x)
{
...
}
my.cpp
void MyFun()
{
...
Foo<int> f;
f.DoSomeThing(5);
...
}
编译my.cpp 的时候去匹配Foo.h 只生成了Foo<int>::DoSomeThing()的申明。在编译Foo.cpp的时候才能匹配到DoSomeThing的真正定义。所以任何时候,定义声明都没遇到一起。因此在链接的时候就找不到此函数的定义了。。。