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多个定义。