C ++内联类方法会导致未定义的引用

当我尝试内联某个类的方法时,出现编译器错误。 当我拿走“inline”关键字时,它就起作用了。

这是一个简单的例子:

main.cpp中:

#include "my_class.h" int main() { MyClass c; c.TestMethod(); return 0; } 

my_class.h:

 class MyClass { public: void TestMethod(); }; 

my_class.cpp:

 #include "my_class.h" inline void MyClass::TestMethod() { } 

我试着编译:

 g++ main.cpp my_class.cpp 

我得到的错误:

 main.cpp:(.text+0xd): undefined reference to `MyClass::TestMethod()' 

一切都好,如果我拿走“内联”。 什么导致这个问题? (我应该如何内联类方法?是否有可能?)

谢谢。

内联函数的主体需要放在头文件中,以便编译器可以根据需要实际replace它。 看到这个: 你如何告诉编译器使内联成员函数?

本标准的7.1.2 / 4:

内联函数应在使用它的每个翻译单元中定义。

您在main.cpp中使用TestMethod,但它没有在那里定义。

…如果一个具有外部联系的function在一个翻译单元内宣布内联,则应在其出现的所有翻译单位内声明为内联; 不需要诊断。

你在my_class.cpp中定义了(并且因此声明了)TestMethod,而不是在main.cpp中。

在这种情况下的修复是将函数定义移动到头文件,如下所示:

 class MyClass { public: void TestMethod() {} }; 

或者像这样:

 class MyClass { public: inline void TestMethod(); }; inline void MyClass::TestMethod() {} 

你已经将它定义为不在头文件中内联,而在cpp文件中,你试图将它定义为内联。 这是一个矛盾的定义,它将无法find另一个。 您的标题是您真正放置inline关键字的位置。

不过,我会删除inline关键字,因为它实际上更多的是对编译器的build议。 当头中有一个自由浮动的函数时,你真的只需要它,你不需要在你的代码库中popup多个定义。