今天写完项目代码编译项目过程中,遇到了一个编译错误
一开始很疑惑,检查了好久代码都没觉得哪里重定义了,后来上网google才发现原因所在。
在C++中,如果将模板结构体的函数定义写在头文件中,而且这个头文件被多个源文件包含,可能会导致多重定义错误(multiple definition)。
解释如下:
当包含头文件的源文件被编译时,编译器会将模板结构体的函数定义实例化为具体的函数,并生成相应的目标代码。如果多个源文件都包含了这个头文件,并且它们都被编译为目标文件,那么链接器在链接这些目标文件时就会遇到多个相同函数定义的情况,从而导致多重定义错误。
为了解决这个问题,可以采取以下方法尝试解决:
-
将模板结构体的函数定义放在头文件中,并使用
inline
关键字修饰这些函数的定义。这将告诉编译器将函数定义视为内联函数,可以在多个源文件中共享定义。// Header file (.h or .hpp) template <typename T> struct MyStruct { void myFunction(); }; template <typename T> inline void MyStruct<T>::myFunction() { // Function implementation }
-
将模板结构体的函数定义放在源文件(.cpp)中,而不是头文件中。这样,每个源文件只会编译并实例化一次模板结构体的函数,避免了多重定义错误。
// Header file (.h or .hpp) template <typename T> struct MyStruct { void myFunction(); }; // Source file (.cpp) template <typename T> void MyStruct<T>::myFunction() { // Function implementation }