我正在使用这个类 - 除了一个模板成员函数之外的所有函数,它将在具有多个源文件的项目中使用,这些源文件在编译时链接。模板类型未知,可以采用任何类型。在这种情况下,我有两个使用该类的源文件,因此具有类声明和定义的头文件在两个源文件中都是#include:ed。然后我得到错误"多重定义"在类的非模板成员函数声明中。我认为这是因为它在链接过程中被定义了两次,因为两个源文件都有非模板成员函数的定义。想象一下下面的无意义情景:
注意:假设所有文件都包含防护,iostream在需要的地方为#include:ed。
foo.hpp
class foo
{
public:
template <typename X>
void f(X);
void ff ();
};
#include "foo.tpp"
foo.tpp
template <typename X>
void foo::f(X val)
{
cout << val;
}
void foo::ff() // multiple definitions
{
cout << sizeof(*this);
}
main2.cpp
#include "foo.hpp"
的main.cpp
#include "foo.hpp"
int main()
{
return 0;
}
将inline关键字添加到函数定义似乎可以解决此错误,但我不想使用它,因为我已经遇到了其他非模板成员函数,这些函数遇到了相同的问题在代码的多个部分中引用。是否有任何解决方法或有效的方法来做我想做的事情?提前谢谢!
答案 0 :(得分:7)
为未声明为foo.cpp
的非模板函数的定义创建第三个inline
文件。该类是非模板的,因此您不需要在标题中定义其所有成员函数,只需要在模板中定义(或maybe not)。