当我尝试内联其中一个类的方法时,我遇到编译器错误。当我拿走“内联”关键字时它会起作用。
这是一个简化的例子:
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()'
如果我带走“内联”,一切都很好。是什么导致了这个问题? (以及我应该如何内联类方法?是否可能?)
感谢。
答案 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文件中,您尝试将其定义为内联。这是一个冲突的定义,它将无法从另一个中找到一个。您的标题是您真正放置内联关键字的位置。
但是,我会删除内联关键字,因为它实际上更多是对编译器的建议。当标题中有自由浮动函数并且您不希望在代码库中弹出多个定义时,您真的只需要它。