2011-01-22 15 views
38

クラスのメソッドをインライン化しようとするとコンパイラエラーが発生します。それは私が "インライン"キーワードを取り除くときに機能します。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()' 

すべてが正常です。この問題の原因は何ですか? (クラスメソッドのインライン化はどうすれば可能ですか?)

ありがとう。

答えて

33

インライン関数の本体は、コンパイラが実際に必要に応じて置き換えることができるように、ヘッダー内にある必要があります。標準のHow do you tell the compiler to make a member function inline?

+1

このリンクは、「このサーバー上の要求されたファイルにアクセスする権限がありません。」というエラーページが表示されます。 –

3

ヘッダファイルではインラインではないと定義していますが、cppファイルではinlineとして定義しようとしています。これは矛盾した定義であり、他のものから1つを見つけることはできません。ヘッダーは実際にインラインキーワードを置く場所です。

しかし、インラインキーワードを削除するのは、実際にはコンパイラーにとってより多くの提案です。ヘッダーに浮動小数点関数があり、コードベースに複数の定義がポップアップしないようにする必要があるのは、本当に必要なだけです。

+0

'inline'キーワードが最も確かにだけではありませんヒントは、少なくともC++ではコンパイラに定義を弱くし、必要な場合にのみそれを発行するようにコンパイラに指示します。これは、使用されている場所に存在しなければならないことを意味しますが、一方で複数回含まれる場合があります。 – bdonlan

+0

私はインラインを置いてもエラーは発生します(または両方にインラインを入れても)。 4つの組み合わせ(my_class.hおよび/またはmy_class.cppのインライン)のうち、インラインのないものだけが動作します。 – FrankMN

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ではなく、main.cppに中のtestMethodをインラインで。

この場合、修正プログラムはこのどちらかのように、ヘッダファイルに関数定義を移動することです:

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

またはこのような

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

inline void MyClass::TestMethod() {}