4

私は C++ が初めてで、オープン ソースの C++ プロジェクトを取得して x コードでコンパイルしようとしています。このコードの最後の 2 行:

template<typename T>
struct TVector3 : public TVector2<T> {
    T z;
TVector3(T _x = 0.0, T _y = 0.0, T _z = 0.0)
    : TVector2(_x, _y), z(_z)

エラーをスローしています:メンバー初期化子は非静的データメンバーに名前を付けていません

メンバー初期化子は非静的データメンバーまたは基本クラスに名前を付けません)に基づいて、コードを次のように変更してみました:

template<typename T>
struct TVector3 : public TVector2<T> {
    T z;
TVector3(T _x = 0.0, T _y = 0.0, T _z = 0.0)
    : TVector2(_x, _y) 
{ z(_z);}

しかし、私は同じエラーが発生しています。スーパークラス Vector2 のコードは次のとおりです。このエラーを解決するにはどうすればよいですか?

struct TVector2 {
    T x, y;
    TVector2(T _x = 0.0, T _y = 0.0)
        : x(_x), y(_y)
    {}
    double Length() const {
        return sqrt(static_cast<double>(x*x + y*y));
    }
    double Norm();
    TVector2<T>& operator*=(T f) {
        x *= f;
        y *= f;
        return *this;
    }
    TVector2<T>& operator+=(const TVector2<T>& v) {
        x += v.x;
        y += v.y;
        return *this;
    }
    TVector2<T>& operator-=(const TVector2<T>& v) {
        x -= v.x;
        y -= v.y;
        return *this;
    }
};
4

1 に答える 1

9

クラス テンプレート内では、テンプレート引数なしで使用するために、独自の名前のみが注入されます。あなたはこれを必要とします:

template<typename T>
struct TVector3 : public TVector2<T> {
    T z;
TVector3(T _x = 0.0, T _y = 0.0, T _z = 0.0)
    : TVector2<T>(_x, _y), z(_z)
于 2013-10-02T12:17:42.993 に答える