我有两个标题。
// header1.h
class A
{
public:
void f();
};
// header2.h
#include "header1.h"
inline void A::f()
{
std::cout << "Yahoo.";
}
// test1.cpp
#include "header1.h"
int main() { A a; a.f(); return 0; }
// test2.cpp
#include "header2.h"
void ff() { /* do nothing */ }
我在 MSVC 2013 上遇到链接错误。 我只有一个翻译单元,所以我想也许不是“ODR”的原因?
现在我有了包含 header2.h 的 test2.cpp。所以我认为链接器现在可以找到 header2.h。 但是还是链接错误,为什么?
最佳答案
这不是使用内联函数的方式。在 test.cpp
文件中,编译器如何知道函数 A::f
被标记为 inline
?
如果你想要一个内联成员函数,你必须在同一个头文件中定义它,或者在它定义的地方包含头文件。
所以解决方案一:#include "header2.h"
而不是 "header1.h"
。
解决方案二:在类内部定义内联函数:
class A
{
public:
void f() { ... }
};
解决方案三:在类之后但在同一个头文件中定义函数:
class A { ... };
inline void A::f() { ... }
关于c++ - 为什么将内联函数def放在其他包含内联函数声明的头文件的头文件中是链接错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24938136/