我有两个内容相同的头文件:
template<typename T> inline void func(){
}
我在main.cpp文件中包含这两个头文件然后编译:
g++ main.cpp -o run
但我明白了:
In file included from main.cpp:2:0:
test2.cpp:1:34: error: redefinition of ‘template<class T> void func()’
template<typename T> inline void func(){
^
In file included from main.cpp:1:0:
test.cpp:1:34: error: ‘template<class T> void func()’ previously declared here
template<typename T> inline void func(){
如果使用可以重新定义的内联函数,我会收到此错误吗?
答案 0 :(得分:5)
你错过了一个关键部分。标准在[basic.def.odr] / 6中说
类类型(第9章),枚举类型(7.2),带内部链接的内联函数(7.1.2),类模板(第14章),非静态函数模板(14.5)可以有多个定义.6),类模板的静态数据成员(14.5.1.3),类模板的成员函数(14.5.1.1),或模板特化,程序中未指定某些模板参数(14.7,14.5.5) ,前提是每个定义都出现在不同的翻译单元 [...]
强调我的
因此,您可以拥有内联函数的多个定义,但这些定义需要位于单独的转换单元(基本上是源文件)中。由于它们属于同一个翻译单元,因此它们违反了这一规定并且您收到错误。
答案 1 :(得分:0)
在任何翻译单元中,模板,类型,功能或对象都可以 只有一个定义。其中一些可以有任意数量 声明。定义提供了一个实例。
答案 2 :(得分:0)
您只能在翻译单元中定义一次功能。内联函数也不例外(它们在链接在一起的单独TU中定义时会出现异常)。
你应该做的是将函数定义移动到它自己的头文件,然后由原始的2个头文件包含。然后你可以在新文件中放置一个标题保护,因此该功能仅在第一次被包含时才被定义。