3

こんにちは、インライン関数が含まれています。Google テストでこのクラスをテストしようとすると、次のようなエラーが発生します。

 error LNK2019: unresolved external symbol "public: double __thiscall Math::returnPi(void)" (?returnPi@Math@@QAENXZ) referenced in function "private: virtual void __thiscall Speed_Math_Test::TestBody(void)" (?TestBody@Speed_Math_Test@@EAEXXZ)

たとえば、私のクラス(ヘッダーファイル)

class Math
{
public:
    Math(void);
    inline double returnPi();
    ~Math(void);
};

私のクラス(cppファイル)

Math::Math(void)
{}
Math::~Math(void)
{}
double Math::returnPi()
{ return 3.14;}

テスト:

TEST(EQ, Math)
{
    Math *m=new Math();
    EXPECT_EQ(3.14,m->returnPi());
}

私は何をする必要がありますか?マニュアルを読みましたが、このエラーを解決する方法がわかりません。

4

2 に答える 2

4

インライン関数は、ソース ファイルではなくヘッダー ファイルにある必要があるため、(ソース ファイルにアクセスできない) 呼び出し元によって実際にインライン化されます。

inlineまた、関数の定義を与える場合、クラス宣言で指定する必要はありません。

したがって、ヘッダーは次のようになります。

class Math
{
public:
    Math(void);
    double returnPi() { return 3.14; } // no need to specify inline here
    ~Math(void);
};

returnPi()ソースファイルからの定義を削除します。

次のこともできることに注意してください。

class Math
{
public:
    Math(void);
    double returnPi();
    ~Math(void);
};


inline double Math::returnPi() { return 3.14; } // inline is mandatory here to avoid respecting the "One Definition Rule"

クラス宣言を関数定義から分離したい場合は、2 番目の解決策が適しています。

またinline、実際の関数呼び出しがインライン化されることを保証するものではないことに注意してください。これが強制する唯一のことは、「1 つの定義規則」を尊重する必要がないことです。inline関数は、すべての翻訳単位で同じ定義を持っている必要があります。

于 2011-04-29T14:22:45.133 に答える
0

クラスの CPP ファイルをプロジェクトの一部としてコンパイルしていますか? これで問題ないはずです。

于 2011-04-29T14:30:36.123 に答える