0

我有两个标题。

// 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”不是原因?

现在我有 test2.cpp 来包含 header2.h。所以我认为链接器现在可以找到 header2.h 。但是还是链接错误,为什么?

4

2 回答 2

3

这不是您使用内联函数的方式。在test.cpp文件中,编译器怎么会知道函数A::f被标记了inline

如果你想要一个内联成员函数,你必须在同一个头文件中定义它,或者在定义它的头文件中包含它。

所以解决方案一:#include "header2.h"而不是"header1.h".

解决方案二:在类内部定义内联函数:

class A
{
public:
    void f() { ... }
};

解决方案三:在类之后但在同一个头文件中定义函数:

class A { ... };

inline void A::f() { ... }
于 2014-07-24T15:40:42.550 回答
0

你的编译器不知道去哪里找A::f(),因为你从来没有告诉它去哪里找。你需要#include "header2.h"在 test.cpp 中。要么,要么将 A::f() 的定义移动到header1.h.

于 2014-07-24T15:41:16.407 回答