4
class BaseA
{
}

class B : public BaseA
{
}

template <class T>
class C : public vector<T>
{
}

void someFunction (void)
{
    C<B> myClass;

    // I can't seem to do this...is it not possible?
    vector<BaseA> converted = ((vector<BaseA>) myClass);
}

私がやろうとしていることについては、コード内のコメントを参照してください。

4

3 に答える 3

12

B のベクトルは、B が A であっても A のベクトルではありません (A と BaseA の間の混同を想定しています)。

試す

vector<A> converted(myClass.begin(), myClass.end());

それはおそらくあなたが表現したいものです。

(ベクターからの継承は一般的に悪い考えです。そのために設計されていません。)

于 2012-04-10T15:58:11.637 に答える
3

C<B>vector<A>は完全に無関係な型であり、そのような変換を明示的に定義する必要があります (例: template <typename TargetValueType> explicit operator vector<TargetValueType> () { ... })。

そのような変換が珍しいタスクであり、クラスの性質にとって本当に自然ではない場合は、範囲コンストラクターを使用することをお勧めします (AProgrammer の回答を参照)。

また:vectorがの場合std::vector、それから派生することはお勧めできません。これは基本クラスとして定義されておらず、通常は派生よりも包含を優先する必要があります (クライアントの結合が緩くなるため)。

于 2012-04-10T15:58:39.280 に答える
0

まさか。Xから派生した別のクラス があると想像してくださいBaseA。オブジェクトを取得できれば、元のオブジェクトでは許可されていなくても、その中にconvertedのインスタンスを挿入できます。X変数のセマンティクスを壊すことになります。

ちなみに、ジェネリックの本当の意味がないJavaでこれを行うことができますが、C#やC ++のような強く型付けされたジェネリック言語では行うことができません(C#の1つの例外を除いて、しかし使用しないでくださいとにかくこの場合)。

于 2012-04-10T15:57:56.520 に答える