C++:: #include:ing template class 多个源文件中的头文件?
C++:: #include:ing template class header file in multiple source files?
我将此 class 与模板成员函数一起使用,除了一个模板成员函数外,这些模板成员函数将用于具有多个源文件的项目,这些源文件在编译时链接。模板类型未知,几乎可以采用任何类型。在这种情况下,我有两个使用 class 的源文件,因此带有 class 声明和定义的头文件在两个源文件中都是#include:ed。然后我在 class 的非模板成员函数声明处得到错误 "multiple definition"。我认为这是因为它在链接过程中被定义了两次,因为两个源文件都定义了非模板成员函数。想象一下下面的无意义场景:
注意:假设所有文件都包含保护并且 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 关键字似乎解决了这个错误,但我不想使用它,因为我有其他非模板成员函数也遇到同样的问题,它们更大并且被引用在代码的多个部分。是否有任何解决方法或有效的方法来做我想做的事情?提前致谢!
创建第三个 foo.cpp
文件,用于定义未声明为 inline
的 non-template 函数。 class 是 non-template,因此您不需要在 header 中定义它的所有成员函数,只需定义模板函数(或 maybe not)。
我将此 class 与模板成员函数一起使用,除了一个模板成员函数外,这些模板成员函数将用于具有多个源文件的项目,这些源文件在编译时链接。模板类型未知,几乎可以采用任何类型。在这种情况下,我有两个使用 class 的源文件,因此带有 class 声明和定义的头文件在两个源文件中都是#include:ed。然后我在 class 的非模板成员函数声明处得到错误 "multiple definition"。我认为这是因为它在链接过程中被定义了两次,因为两个源文件都定义了非模板成员函数。想象一下下面的无意义场景:
注意:假设所有文件都包含保护并且 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 关键字似乎解决了这个错误,但我不想使用它,因为我有其他非模板成员函数也遇到同样的问题,它们更大并且被引用在代码的多个部分。是否有任何解决方法或有效的方法来做我想做的事情?提前致谢!
创建第三个 foo.cpp
文件,用于定义未声明为 inline
的 non-template 函数。 class 是 non-template,因此您不需要在 header 中定义它的所有成员函数,只需定义模板函数(或 maybe not)。