0

このコードを検討してください

#include <iostream> 
#include <cstdio>
using namespace std;

class Dummy {
public:
    Dummy();
};

inline Dummy::Dummy() {
    printf("Wow! :Dummy rocks\n");
}

int main() {
    Dummy d;
}

ここですべてが良いです!

今、私はこの修正を行います。Dummy の宣言を「dummy.h」に移動します。

class Dummy {
public:
    Dummy();
};

そして、コンストラクタ Dummy() を "dummy.cpp" で次のように定義します。

#include "dummy.h"
inline Dummy::Dummy() {
    printf("Wow! :Dummy rocks\n");
}

そして最後に、メインファイルは次のとおりです。

#include <iostream> 
#include <cstdio>
#include "dummy.h"
using namespace std;

int main() {
    Dummy d;
}

正常にコンパイルされますが、Dummy::Dummy() への未定義の参照を訴えるリンカ エラーが発生します。

あらゆる洞察。

--

4

3 に答える 3

3

すべてのインライン関数 (メソッドとコンストラクター/デストラクターを含む) を、それらが宣言されているヘッダー ファイルに配置する必要があります。

このコードはどちらの方法でも機能するはずですが、キーワードが存在しないmain()かのようにコンストラクターを呼び出します。inlineオブジェクト ファイルを両方のコンパイル ユニットからリンカーに渡していますか?

于 2010-06-26T15:05:55.093 に答える
2

C++ でコンパイルがどのように機能するか、C++ で使用される個別のコンパイル ユニットのアイデア、およびヘッダーと cpp ファイルを使用して得られるカプセル化について考える必要があります。

こちらをご覧ください: http://www.parashift.com/c++-faq-lite/inline-functions.html#faq-9.6

インラインは、関数を呼び出す代わりに、関数呼び出しの場所にそのコードを「コピー - ペースト」することをコンパイラに伝えます。インライン定義を CPP ファイルに配置すると、他のコンパイル済みユニット (h ファイルではなく cpp ファイル内) へのリンク中には表示されないため、コンパイラは、クラスに配置された署名からパラメーターのないコンがあることを理解します。したがって、デフォルトのものは実装されません。しかし、リンカーは関数本体を見つけることができません。これは、cpp ファイルでインラインで実装されているためです。

于 2010-06-26T15:26:36.033 に答える
0

実装ファイルからインライン指定子を削除してみてください。私の理解が正しければ、ヘッダーにのみインライン化できます

于 2010-06-26T15:07:49.833 に答える