编译头文件定义了一个模板类,该类还包括其他头文件
compile header files defines a template class which also includes other header files
只是想明确一点:这与我们必须在头文件中定义模板类的函数的问题有不同。
UPDATE:如果您需要真正的源代码,可以在这里下载:https://Near@bitbucket.org/Near/compile_error.git
我实现了一个双列表类。
// list.h //
class list {
//...
void insert(...);
};
// list.cpp //
#include "list.h"
void list::insert(...) {
...
}
我还实现了一个模板类,其中包括list.h
// template_class.h //
#include "list.h"
template<class T>
class temp_class {
list l;
void func();
}
void temp_class::func() {
//...
l.insert(...);
}
现在,我编写了一个test.cpp文件,其中包含template_class.h,并调用函数
// test.cpp //
#include "template_class.h"
int main() {
temp_class<int> t;
t.func();
return 0;
}
我像这样编译
g++ test.cpp list.cpp -o test
编译器抱怨test.cpp:"未定义的插入引用"。为什么它不能工作?如何解决此错误?
仅供参考:如果我把list.cpp中的内容包含在list.h中,然后只编译test.cpp,它就可以工作了。但我认为这不是一个好主意。
编译代码时,我立即收到警告:
list_double.h:14:15: warning: inline function ‘void list_double_node::list_double_insert_first(list_double_node*)’ used but never defined [enabled by default]
void inline list_double_insert_first(list_double_node* entry);
也就是说,你的代码实际上类似于这个SSCCE:
// list.h
class list {
public:
inline void insert(int);
};
// list.cpp
#include "list.h"
void list::insert(int) {
}
// template_class.h
#include "list.h"
template<class T>
class temp_class {
list l;
public:
void func();
};
template <class T>
void temp_class<T>::func() {
l.insert(17);
}
// test.cpp
#include "template_class.h"
int main() {
temp_class<int> t;
t.func();
return 0;
}
修复方法是:删除inline
或在标头中定义函数。inline
的规则实际上与template的规则几乎相同:无论何时使用inline
函数,都必须提供其实现。
相关文章:
- 使用模板参数还包括 constexpr 成员函数enable_if单独定义和声明模板成员函数
- 在单元测试项目中包括 .c 文件,并从多个 cpp 文件访问它而不会出现链接问题
- C++包括文件
- 用libclang解析源文件 - 链接问题包括文件
- C 包括文件会导致未知错误
- C++选择文件夹,包括文件
- 在C 中包括文件/模块
- Visual Studio 14.0 和 Windows 工具包中的错误包括文件夹
- 为什么C 标准仍然不包括文件系统和网络
- 循环依赖性包括文件
- 致命错误C1083:无法打开包括文件:'hoa.h':没有这样的文件或目录
- 在C++的应用程序中包括文件(dll,txt等.exe
- SystemC - 测量并在系统C仿真中包括文件解析时间
- 编译头文件定义了一个模板类,该类还包括其他头文件
- C++包括 C 文件(找不到 typedef)
- 包括文件冲突解决方案
- Visual Studio中的嵌套文件夹结构-包括文件
- 包括H文件在其他程序x
- 包括.h文件2类
- 如何处理指针截断在ATLMFC包括文件