2011-01-22 99 views
38

当我尝试内联其中一个类的方法时出现编译器错误。当我拿走“inline”关键字时,它会起作用。C++内联类方法会导致未定义的引用

下面是一个简化的例子:

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

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

但是,我会删除inline关键字,因为它实际上更多的是对编译器的建议。如果头中有一个自由浮动函数,并且不希望在代码库中弹出多个定义,则只需要它。

+0

`inline`关键字最肯定不只是一个暗示,至少在C++中 - 它们告诉编译器使定义变弱,并且只在需要时才发出。这意味着它必须存在于使用的地方,但另一方面可能会包含多次 – bdonlan 2011-01-22 17:53:49

+0

无论我在哪里放置内联(或者如果我将内联放在两者中),我仍然会收到错误。在4种组合中(my_class.h和/或my_class.cpp中的内联),只有没有inline的工作组才能工作。 – FrankMN 2011-01-22 17:54:53

15

7.1.2/4的标准:

An inline function shall be defined in every translation unit in which it is used...

您在main.cpp中使用TestMethod的,但它没有定义。

... If a function with external linkage is declared inline in one translation unit, it shall be declared inline in all translation units in which it appears; no diagnostic is required.

您在my_class.cpp定义(因此也宣告)TestMethod的内联,但不是在main.cpp中。

在这种情况下,修复方法是函数定义移到头文件,无论是这样的:

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

或像这样:

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

inline void MyClass::TestMethod() {} 
相关问题