2011-01-22 69 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() {} 
相關問題