2

問題の解決策をインターネットで探していますが、私のような質問の例は見つかりませんでした (私が認識しています)。

テンプレート クラスの単純なコンストラクターを作成しようとしていますが、テスト時に同じコンパイル エラーが発生し続けるため、構文または実装に何か問題があるはずです。引数なしでオブジェクトを作成すると、正常にコンパイルされるため、引数を渡す方法と関係があるようです (引数を取らないコンストラクターがないため、これは奇妙に思えます)。

vecxd.hpp:

#ifndef JF_VecXd
#define JF_VecXd

template <class T>
class VecXd : public VecXd<T>{
    public: 
        VecXd(T a, T b, T c);   

    private:
         T x, y, z; 

};

template <class T> 
VecXd<T>::VecXd(T a, T b, T c){
    x = a; 
    y = b;
    z = c;
}

#endif

test.cpp:

#include "vecxd.hpp"

int main(){
    int a = 3, b = 4, c = 5;
    VecXd<int> tVec(a,b,c);

    return 0;
}

エラー:

3 vecxd.hpp 未定義の型「class VecXd」の無効な使用

しかし、引数なしでオブジェクトを作成すると、次のようにコンパイルされます。

int a = 1, b = 2, c = 3;
VecXd<int> tVec();

//Instead of this: VecXd<int> tVec(a, b, c)

お時間を割いていただき、ありがとうございました。この件に関して何かアドバイスをいただければ幸いです。

4

1 に答える 1

5

これ:

template <class T>
class VecXd : public VecXd<T> {

する必要があります

template <class T>
class VecXd {

これは最初に型がそれ自体から派生したことを意味するため、これは決して機能しません。エラーは、自分で宣言したばかりのクラスであるため、不完全な基本クラスを参照しています。

うまくいくように見えるのは

VecXd<int> tVec();

これは関数宣言だからです。実際のインスタンスが必要な場合は、括弧を削除します。

VecXd<int> tVec;

元のコードでエラーが発生します。

于 2013-09-14T19:57:40.797 に答える