私はbase
クラスと多数の派生クラスを持っています(ここでは簡略化のために1つしかありません)。私はまた、holder
クラスを派生クラスの1つをテンプレート引数として持っています。私はholder
オブジェクトを派生クラスのインスタンスを作成します。コードは次のとおりです。C++派生クラステンプレートのインスタンスを作成する方法
class base {
protected:
int value;
public:
base() : value (0) { }
base(int value) : value(value) { }
};
class derived : public base { };
template <class T>
class holder {
public:
holder(T) {}
T create(int value) {
return T(value);
}
};
int _tmain(int argc, _TCHAR* argv[])
{
holder<base*> h(&derived());
derived* d = h.create(1); // error here
}
エラー:error C2440: 'initializing' : cannot convert from 'base *' to 'derived *'
が表示されます。変数の型はholder<base*>
なので、create
メソッドはテンプレート引数としてbase
で呼び出されます。しかし、派生クラスがたくさんある場合は、どうすれば適切にキャストできますか?
UPD。 holder::create
メソッドがstd::remove_pointer
を使用するように変更しましたが、同じコンパイルエラーが発生します。
T create(int value) {
return new (std::remove_pointer<T>::type)(value);
}
あなたは 'int'を使って' base * 'を作成していることに気付きましたか?あなたのコードはコンパイルされますか? – perencia
何をしようとしていますか?コンパイラは、一時的なアドレスを取得することについてもエラーを出しませんでしたか? – LogicStuff
ホルダーは基本型ではなく派生型を保持できますか? –