c++ - 为什么将内联函数def放在其他包含内联函数声明的头文件的头文件中是链接错误?

标签 c++ inline one-definition-rule

我有两个标题。

// 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/

相关文章:

c++ - ODR-used 规则不适用于 visual studio

c++ - 为什么在内联函数内部调用的函数不需要定义?

c++ - 英特尔 TBB 代码在 Windows 和 Linux 中具有不同的执行时间

css - 覆盖wordpress模板的内联css

javascript - onsubmit 返回确认转到 url

c++ - 不同的别名模板能否解决跨库的潜在 ODR 违规问题?

使用模板的C++静态编译错误

c++ - 在处理程序中排队请求时,从多个线程或一个线程调用boost asio io_service.run

C++ 显示一个字符串

javascript - 内联JS不以html形式调用