32

特定のクラスのインライン メンバー関数を使用しようとしています。たとえば、インライン化なしの関数の宣言と実装は次のとおりです。

ヘッダーファイルで:

int GetTplLSize();

.cpp ファイルで:

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

何らかの理由で、「inline」キーワードを実装と宣言のいずれか一方、および両方に配置すると、次のようなリンカ エラーが発生します。

ライブラリ C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX_HN~1\templib.x およびオブジェクト C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX_HN~1\templib.exp の作成
mexfunction.obj : エラー LNK2019: 未解決の外部シンボル "public: int __thiscall NeedleUSsim::GetTplLSize(void)" (?GetTplLSize@NeedleUSsim@@QAEHXZ) が関数 _mexFunction で参照されています
mexfunction.mexw32 : 致命的なエラー LNK1120: 1 つの未解決の外部

  C:\PROGRA~1\MATLAB\R2008B\BIN\MEX.PL: エラー: 'mexfunction.mexw32' のリンクに失敗しました。

このエラーを取り除くには何が必要ですか (つまり、これらのインライン メンバー関数を作成する際に何が間違っているのでしょうか)。

4

5 に答える 5

35

次に、関数定義をヘッダーに入れる必要があります。コンパイラにインライン化を指示する最も簡単な方法は、次のようにクラス宣言にメソッド本体を含めることです。


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

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


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

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

定義は、そのメソッドを使用する各翻訳単位で表示される必要があります。

于 2009-06-05T00:13:40.647 に答える
26

C++ FAQ Lite より

インライン関数の定義を .cpp ファイルに入れ、それを他の .cpp ファイルから呼び出すと、リンカーから「未解決の外部」エラーが発生します。

メンバ関数をインライン化するようにコンパイラに指示するにはどうすればよいですか?

于 2009-06-05T00:15:46.850 に答える
5

他の人がすでに指摘しているように、次のように、インライン関数の定義をヘッダー ファイルに移動する必要があります。

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

これは、コンパイラがインライン化された関数の呼び出しを検出したときに、インライン化するコードを知る必要があるためです。関数の定義を NeedleUSsim クラスの .cpp ファイルに残すと、コンパイラが生成するコードが NeedleUSsim オブジェクト ファイルにトラップされます。コンパイラはソース コードを読み取るだけで、別のクラスのオブジェクト ファイルを覗くことはありません。別の .cpp ファイルをコンパイルするときに、どのコードで呼び出しを置き換えるかを知る方法がありません。

于 2009-06-05T01:00:24.967 に答える
3

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

于 2009-06-05T00:09:02.557 に答える
0

インラインガードマクロイディオムを参照してください。これにより、少なくともコードを宣言から分離することができます。また、を介して関数のインライン化を切り替えることもできますdefine

于 2009-06-05T02:21:58.827 に答える