0

テンプレート クラスがインラインで定義されている場合、次のコードは正常に機能します。

main
{
   unsigned int A=0;                       //local variable in  'main'.
   Test<int>  TestObjekt;   //Object.
   //do something
   cout<<TestObjekt.calculate_a(A);
};

クラスは 4 つのテスト理由で作成され、指定されたデータ 'a' に '2' が追加され、メインのローカル変数 'A' に結果が返されます。

template <typename T> class Test        //dichiarazione classe
{
private: 
     T a;      //private variable of changeable type T.

public:               
  Test(T InitA)     //constructor
  {
     a=InitA;
  }

  T calculate_a(T a)  //method
  {
     a+=2;
     return a;
  }
};

この方法では、すべてが正常に機能しますが、クラスのアウトライン定義を作成すると、コンパイラはそれを受け入れなくなります。宣言は次のとおりです。

template <typename T> class Test        //class declaration
{
private: 
  T a;      //private variable

public:               
  Test(T InitA);  //constructor
  T calculate_a(T);  //method
};

今私の定義:

template <typename T>  Test<T>::Test(T InitA)
{
   a=InitA;
}

template <typename T> T Test<T>::calculate_a(T)  //metodo della classe Test
{
   a+=2;
   return a;
}

エラーメッセージは次のとおりです。

1.error C2512: 'Test<T>': non è disponibile alcun costruttore predefinito...  
  means: there is no appropriate, predefined constructor available

1>        with
1>        [
1>            T=int
1>        ]

Visual C++ 2008 Express バージョン コンパイラを使用しています。私は C++ の初心者であり、プログラムを実行するためにすでに長い間戦っているため、ほとんど神経衰弱に陥っています。

誰かが私を助けてくれることを願っています

感謝と敬意

ウーヴェ

4

2 に答える 2

1

この行は、存在しないTest<int> TestObjekt;デフォルトのコンストラクターを暗黙的に呼び出しています。Test<int>()

メインのコンストラクター呼び出しに引数を追加する必要があります。Test<int> TestObjekt(0);

または、代わりに、値を必要としないコンストラクターを定義しますTest(){ \\do something }


また、テンプレート定義はヘッダー ファイルにある必要があります。

ヘッダーで定義が必要な理由については、この回答を参照してください。

于 2013-06-04T11:19:15.877 に答える
1

Test オブジェクトが作成されるメイン関数で、値をコンストラクターに追加します (init-value で TestObject を作成します)。

Test<int>  TestObjekt(0);   // Object with init value

または、値を必要としないコンストラクターを作成します。たとえば、クラス宣言で、コンストラクターのプロトタイプにデフォルト値を追加します。

Test(T InitA= 0);  //constructor with default value

完全版:

template <typename T> class Test        //class declaration
{
    private: T a;      //private variable

    public:               
        Test(T InitA= 0);  // <<<-- either change here
        T calculate_a(T);  //method
};

またはメインを変更します:

void main()
{
    unsigned int A=0;             //local variable in  'main'.

    Test<int>  TestObjekt(0);   // <<<--- change here.

    //do something
    printf("%d", TestObjekt.calculate_a(A));
};
于 2013-06-04T11:17:26.110 に答える