質問
私は、特定のクラスのインラインメンバ関数を使用しようとしています。例えばインライン化せずに関数宣言と実装は、通りである:
ヘッダ・ファイルに
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)" (?GetTplLSize@NeedleUSsim@@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.
何が(つまり、私はこれらのインラインメンバ関数を作るという点で間違って何をやっている)、このエラーを取り除くためにする必要があります?
解決
これで、ヘッダーに関数定義を配置する必要があります。インラインのコンパイラを暗示する最も簡単な方法は、クラス宣言内のメソッド本体を含むことがあるような
class NeedleUSsim
{
// ...
int GetTplLSize() const { return sampleDim[1]; }
// ...
};
または、あなたは別の宣言と定義を主張する場合:
class NeedleUSsim
{
// ...
int GetTplLSize() const;
// ...
};
inline int NeedleUSsim::GetTplLSize() const
{ return sampleDim[1]; }
の定義は、その方法を使用する各翻訳単位で表示しなければならない。
他のヒント
C ++よくある質問Liteとから
あなたが入れた場合は、インライン関数の .cppファイルに定義し、それならば 他のいくつかの.cppファイルから呼び出され、 あなたは「未解決の外部」を取得します リンカからエラーます。
他の人がすでに指摘したように、あなたがそうのように、ヘッダファイルにインライン関数の定義を移動する必要があります:
class NeedleUSsim
{
// ...
inline int GetTplLSize() { return sampleDim[1]; }
// ...
};
この理由は、コンパイラがインライン関数の呼び出しを見たときにインライン化するどのようなコードを知っている必要があることです。あなたはNeedleUSsimクラスの.cppファイル内の関数の定義、それはNeedleUSsimオブジェクトファイルの中に閉じ込めてしまうため、コンパイラが生成するコードのままにした場合。コンパイラは唯一のソース読み込むようなコードを、それが別のクラスのオブジェクトにピークしたことがないファイル - それは単に、それは別の.cppファイルをコンパイルするの呼びかけを交換するどのようなコードを知る方法がありません。
あなたはインライン関数を持っている場合は、ヘッダファイルに定義を配置する必要があります。
インラインマクロイディオムをガード参照してください。これは、少なくとも、あなたが宣言から、わずかとはいえ、コードを分離することができます。また、あなたがdefine
を経由して関数のインライン化を切り替えることができます。