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

时间:2011-01-22 17:48:47

标签: 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()'

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

感谢。

3 个答案:

答案 0 :(得分:36)

内联函数的主体需要位于标头中,以便编译器实际上可以在需要的地方替换它。请参阅:How do you tell the compiler to make a member function inline?

答案 1 :(得分:16)

7.1.2 / 4标准:

  

应在中定义内联函数   每个翻译单元   二手...

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

  

...如果是具有外部链接的功能   在一个翻译中内联声明   单位,应在内联合宣布   所有翻译单位   出现;无需诊断。

您在my_class.cpp中定义(并因此也声明)TestMethod内联,但不在main.cpp中定义。

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

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

或者像这样:

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

inline void MyClass::TestMethod() {}

答案 2 :(得分:3)

您已将其定义为未在头文件中内联,而在cpp文件中,您尝试将其定义为内联。这是一个冲突的定义,它将无法从另一个中找到一个。您的标题是您真正放置内联关键字的位置。

但是,我会删除内联关键字,因为它实际上更多是对编译器的建议。当标题中有自由浮动函数并且您不希望在代码库中弹出多个定义时,您真的只需要它。