C++-C++模板声明和定义为什么必须放在一起

发布于 2017-01-26 02:41:23 字数 90 浏览 1138 评论 2

C++的模板定义和声明必须放在一个文件中,如果我把声明放在一个.h文件中,定义放在另一个.cpp中,便无法通过编译。比如VS2008.

这是为什么呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

晚风撩人 2017-08-18 12:11:20

可以分开放,但是要在头文件之后包含相应的实现文件,这是一种方法,叫做包含编译模型(inclusion compilation model)
还有一种是使用export关键字,叫做分别编译模型(separate compilation model)
,不过只有少数的编译器实现这种模型。我用的g++ 4.6.3不支持!

c++ primer有两种编译模型的详细讲解。

归属感 2017-06-07 00:40:40

模板类似宏的实现,在代码编译的时候,遇到模板申明就生成对应的模板类和方法(新的一个类),如果申明和定义是分开的,在编译的时候是对的,因为找到了相应的定义,但在链接的时候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的真正定义。所以任何时候,定义声明都没遇到一起。因此在链接的时候就找不到此函数的定义了。。。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文