首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >具有模板的c++类找不到其构造函数

具有模板的c++类找不到其构造函数
EN

Stack Overflow用户
提问于 2009-03-13 20:05:13
回答 7查看 17.2K关注 0票数 15

我有个问题我不太明白。我有一个类节点。

代码语言:javascript
复制
template<class T>
class node {
protected:
    T _data;
public:
    node(T data);   
};

这在"node.h“文件中。在"node.cpp“文件中,有这样的构造函数:

代码语言:javascript
复制
#include "node.h"

template<class T>
node<T>::node (T data) {
    _data = data;
}

虽然编译器没有发现错误,但链接器(ld)告诉我:

/usr/bin/ld:未定义的符号:

node::node(int)

奇怪的是..。如果我将构造函数从.cpp移到.h文件中,一切都会正常工作。问题出在哪里?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-03-13 20:10:06

问题是模板不是类-通常不会将它们写在两个单独的文件中。模板类是编译器用来生成类的代码。因此,您的实现代码需要有效地内联,即,如您所发现的,在头文件中。

有关为什么必须采用这种方式的完整解释,请参阅C++ FAQ Lite

票数 24
EN

Stack Overflow用户

发布于 2009-03-13 20:08:47

一般来说,您必须将所有模板成员放在头文件中。模板是在使用的基础上编译的,因此,无论在哪里使用模板,整个定义都需要可用。将代码放在头文件中就可以解决这个问题。

只有当模板仅在CPP文件中使用时,才能将模板定义放入CPP文件中。原因是它符合整个定义可供编译的标准。

将node.cpp的内容移动到node.h可以解决这个问题。

奇怪的场景

然后,您也可以将所有内容都放在CPP文件中,并包含该CPP文件。C++在这方面很灵活。我之所以提到这一点,是因为我以前见过这样做。当它撞到我的桌子上时,我的下巴被擦伤了。

票数 13
EN

Stack Overflow用户

发布于 2009-03-13 20:09:38

当你使用 node<int>时,你很可能没有包括node.cpp。因此,编译器无法实例化node<int>::node<int>构造函数。通常,您将所有模板代码,包括方法的所有实现,都放在头文件中,或者包含在头文件中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/644397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档