2

メソッド (またはコンストラクター) のパラメーターの既定値に、ある種のセマンティック ロジックを適用しようとしています。これが私が試したことです:

#include <iostream>
#include <vector>
class Test
{
public:
    static const std::vector<int> staticVector;
    Test (const std::vector<int> &x = Test::staticVector) {}
};

int main ()
{
    Test x;

    return 0;
}

staticVector はかなり冗長ですが、C++ では std::vector のインスタンスとして NULL を渡すことができないため、コンストラクター std::vector() への冗長な呼び出しを避けたいので、このアプローチを思いつきました.. .

残念ながら、コンパイルしようとすると、リンカーは次のエラーをスローします。

error LNK2001: unresolved external symbol "public: static class std::vector<int,class std::allocator<int> > const Test::staticVector" (?staticVector@Test@@2V?$vector@HV?$allocator@H@std@@@std@@B)

ここで何が欠けていますか?

4

2 に答える 2

6

これは実際には、デフォルト パラメータの使用とは何の関係もありません。代わりに、静的変数が C++ でどのように機能するかの副作用です。

C++ クラスに静的オブジェクトを含めるには、2 段階のプロセスがあります。最初に、静的オブジェクトを宣言する必要がありますが、それを行った後、実際にどこかで定義する必要があります。これにより、C++ はどの翻訳単位にその静的オブジェクトの 1 つの定義を含める必要があるかを認識できます。あなたは書くことによってこれを行うことができます

const std::vector<int> Test::staticVector;

クラス外の C++ ソース ファイルのどこかに。これにより、ソース ファイルにこのオブジェクトの定義が含まれていることが C++ に通知され、リンカー エラーが解決されます。

1 つだけでなく複数の異なるソース ファイルがある場合は、この行をTestヘッダーではなくクラスのソース ファイルに配置する必要があります。

お役に立てれば!

于 2012-06-13T00:59:00.787 に答える
1

静的メンバーを宣言しましたが、定義していません。クラスの後、次のようなものが必要です。

 const std::vector<int> Test::staticVector;

実際に何をしようとしているかに応じて、何らかの値で初期化することをお勧めします。

于 2012-06-13T01:11:47.217 に答える