4

私はコードパッドを使用していて、C++ を使用してスキルを磨こうとしていました。テンプレートをあまり使ったことがなかったので、使い方を調べてみました。以下のコードはその結果であり、残念ながら動作しません。問題の解決策を探してみましたが、テンプレートを使用した経験があまりないため、自分の問題と他の問題を関連付けることができませんでした。そこで、助けを求めることにしました。

template <class A>
class Vector2 {
public:
    A x,y;
    Vector2(A xp, A yp){
        this->x = xp;
        this->y = yp;
    }
};

template <class B, class A>
class rayToCast {
public:
    rayToCast(B angle, Vector2<A> origin, Vector2<A> point1, Vector2<A> point2){
        this->RAngle = angle;
        this->Point1 = point1;
        this->Point2 = point2;
    }
private:
    B RAngle;
    Vector2<A> point1,point2;
};

int main(){
    rayToCast<short int, float> ray(45, Vector2<float>(0.0, 0.0), Vector2<float>(-10.0, -3.0), Vector2<float>(5.0, 7.0));
    return 0;
}

出力は次のとおりです。

t.cpp: In constructor 'rayToCast<B, A>::rayToCast(B, Vector2<A>, Vector2<A>, Vector2<A>) [with B = short int, A = float]':
t.cpp:26:   instantiated from here
Line 14: error: no matching function for call to 'Vector2<float>::Vector2()'
compilation terminated due to -Wfatal-errors.

どんな助けでも大歓迎です。

4

6 に答える 6

6

コンストラクターは、のデフォルト コンストラクターを呼び出して、rayToCastを初期化しようとします。しかし、それはありません。point1point2Vector2

ベクトル クラスのデフォルト コンストラクターを提供するか、または のメンバーを明示的に初期化する必要がありrayToCastます。1 つの方法は、次のようにすることです。

rayToCast(B angle, Vector2<A> origin, Vector2<A> point1, Vector2<A> point2)
   : RAngle(angle), point1(point1), point2(point2)
{ }
于 2013-01-14T20:43:22.963 に答える
3

エラーはテンプレートに関するものではありません。

あなたのVector2クラスにはデフォルトのコンストラクターがありませんが、 のコンストラクターでデフォルトのコンストラクターを使用してクラスを作成したいと考えていますrayToCast

のコンストラクターでメンバー初期化子リストを使用するrayToCastか、 で既定のコンストラクターを作成しますVector2

于 2013-01-14T20:44:02.300 に答える
3

コードに 2 つの問題があります。

Vector2 にはデフォルトのコンストラクターがありません。Vector2 をrayToCastコンストラクターに渡すと、デフォルトのコンストラクターが呼び出されます。

rayToCast(B angle, Vector2<A> origin, Vector2<A> point1, Vector2<A> point2)

デフォルトのコンストラクターを Vector2 に追加x,yし、デフォルト値に初期化する必要があります。

template <class A>
class Vector2 {
public:
    A x,y;
    Vector2() : x(), y() {}  // default constructor
    Vector2(A xp, A yp){
        this->x = xp;
        this->y = yp;
    }
};

また、タイプミスがあります。point1/point2 ではなく、Point1、Point2 にする必要があります。

class rayToCast {
public:
    rayToCast(B angle, Vector2<A> origin, Vector2<A> point1, Vector2<A> point2){
        this->RAngle = angle;
        this->Point1 = point1;
        this->Point2 = point2;
    }
private:
    B RAngle;
    Vector2<A> Point1;    // capital P
    Vector2<A> Point2;    // capital P
};
于 2013-01-14T20:48:08.057 に答える
2

コンストラクターを宣言しない場合は、デフォルトのコンストラクターが自動生成されます (デフォルト コンストラクターとコピー コンストラクター)。

コンストラクターを宣言すると、自動生成されたコンストラクターを取得できなくなります (必要に応じて、他のコンストラクターを手動で定義する必要があります)。

を定義したためVector2(A xp, A yp)、コンパイラは自動生成しなくなり、使用する場合は自分Vector2()で定義する必要があります。Vector2()

于 2013-01-14T20:42:57.380 に答える
1

あなたのコードのこの部分を取ります:

rayToCast(B angle, Vector2<A> origin, Vector2<A> point1, Vector2<A> point2){
    this->RAngle = angle;
    this->Point1 = point1;
    this->Point2 = point2;
}

Point1初心者の C++ プログラマーには、これはとを初期化するように見えますPoint2が、そうではありません。初期化はデフォルトで行われるか (Vector2<A>デフォルトのコンストラクターがないため、ここでは発生しません)、またはメンバーの初期化リスト(使用していません) で行われます。コンストラクター本体での割り当ては、まさに事後の割り当てです。

おそらく、デフォルトのコンストラクターを指定しない理由があるので、そのコンストラクターにコンストラクター引数からこれらの/メンバーを適切に初期化Vector<A>させることで修正します。rayToCastPoint1Point2

rayToCast(B angle, Vector2<A> origin, Vector2<A> point1, Vector2<A> point2)
   : RAngle(angle)
   , point1(point1)
   , point2(point2)
{}

また、変数と引数の名前を整理することをお勧めします。それらは私を少し混乱させたからです(ここに大文字、そこにない、どこにもない、どこにでもある、どこにある!)

于 2013-01-14T20:58:08.970 に答える
0

他の人がすでに指摘しているように、エラーはデフォルトのコンストラクターがないことです。BoPerssonが提案した構文を使用します。

もう1つのエラーは、変数名で大文字と小文字が区別されることです。たとえば、次のように作成したコンストラクターでは、次のrayToCastように記述します。

this->Point1 = point1;

ただし、クラス属性に名前を付けましたpoint1。これは次のものと同じではないことに注意してください。

this->point1 = point1;
于 2013-01-14T20:52:28.747 に答える