2009-06-05 14 views
22

特定のクラスのインラインメンバ関数を使用しようとしています。たとえば、インライン化せずに関数宣言と実装のような次のとおりです。ヘッダファイル内インライン関数リンカエラー

int GetTplLSize(); 

.cppファイル内:

int NeedleUSsim::GetTplLSize() 
{ 
    return sampleDim[1]; 
} 

何らかの理由で、私は "を置けば実装と宣言のどちらか一方と同様に、インラインのキーワードを使用すると、次のようにリンカーエラーが発生します。

 
Creating library C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX_HN~1\templib.x and object C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX_HN~1\templib.exp 
mexfunction.obj : error LNK2019: unresolved external symbol "public: int __thiscall NeedleUSsim::GetTplLSize(void)" ([email protected]@@QAEHXZ) referenced in function _mexFunction 
mexfunction.mexw32 : fatal error LNK1120: 1 unresolved externals 

    C:\PROGRA~1\MATLAB\R2008B\BIN\MEX.PL: Error: Link of 'mexfunction.mexw32' failed. 

このエラーを取り除くために必要なもの(例:これらのインラインメンバー関数を作成する点で私は間違って何をしていますか?)

答えて

23

ヘッダーに関数定義を入れる必要があります。


class NeedleUSsim 
{ 
    // ... 
    int GetTplLSize() const { return sampleDim[1]; } 
    // ... 
}; 

か、あなたは別の宣言と定義を主張する場合:


class NeedleUSsim 
{ 
    // ... 
    int GetTplLSize() const; 
    // ... 
}; 

inline int NeedleUSsim::GetTplLSize() const 
{ return sampleDim[1]; } 

定義がなければならないインラインにコンパイラを暗示する最も簡単な方法は次のようにクラス宣言にメソッド本体を含めることですその方法を使用する各翻訳単位で表示されます。

+0

これは唯一の方法ですか? (私は可読性の理由から宣言と実装を別々に分けたい) – stanigator

+1

基本的にはい。コンパイラは、関数の本体を知っていなければならないので、本体はインクルードされたヘッダファイルになければなりません。 しかし、まだクラス宣言で関数を宣言して、実装をヘッダファイルの後の場所に追加することはできます。私は参照してください – Hans

+0

。私はちょうどこの方法でコードを書いて生きなければならないと思う。アドバイスをいただきありがとうございます。 – stanigator

2

インライン関数を使用している場合は、定義をヘッダーファイルに入れる必要があります。

+0

ヘッダーファイルの定義にインラインキーワードを入れようとしましたが、同じリンカーエラーが表示されます。 – stanigator

+2

インラインキーワードだけでなく、定義全体がヘッダーファイルに書き込まれます。したがって、.cppファイルから.hファイルに移動します。 – ChrisInEdmonton

+1

宣言ではなく、定義。 –

17
C++よくある質問Liteとから

あなたが.cppファイルにインライン関数の 定義を置く場合、それは は、他のいくつかの.cppファイル、 から呼び出された場合は、外部の「未解決取得します" リンカからのエラーです。他の人がすでに指摘したように

How do you tell the compiler to make a member function inline?

+0

残念ながら、ちょっと難しい方法を見つけたので、これはMSVC 2013と2015のケースではありません。 (ライブラリ内の)CPPファイル内にインラインであり、そのコードは同じ名前のインラインを持つ完全に異なるCPPソースコードから呼び出されました。私はその開発環境のバグと考えています。見つけにくい... – chksr

3

、あなたはそうのように、ヘッダファイルにインライン関数の定義を移動する必要があります。

class NeedleUSsim 
{ 
    // ... 
    inline int GetTplLSize() { return sampleDim[1]; } 
    // ... 
}; 

この理由はそれですコンパイラは、インライン関数を呼び出すときにどのコードをインラインにするかを知る必要があります。 NeedleUSsimクラスの.cppファイルに関数の定義を残すと、コンパイラが生成するコードはNeedleUSsimオブジェクトファイルに閉じ込められます。コンパイラはソースコード—のみを読み取るので、別のクラスのオブジェクトファイルを参照することはありません—別の.cppファイルをコンパイルしているときに、呼び出しを置き換えるコードを知る方法がありません。

0

Inline Guard Macro idiomを参照してください。これは少なくとも、宣言からコードを少しでも分けることを可能にします。また、defineを使用して関数のインライン展開を切り替えることもできます。

関連する問題