2016-05-22 13 views
0

私は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); 
} 
+0

あなたは 'int'を使って' base * 'を作成していることに気付きましたか?あなたのコードはコンパイルされますか? – perencia

+0

何をしようとしていますか?コンパイラは、一時的なアドレスを取得することについてもエラーを出しませんでしたか? – LogicStuff

+0

ホルダーは基本型ではなく派生型を保持できますか? –

答えて

1

あなたは所有者が派生型ではなく、基本型を保持させ、すべての所有者を格納する(++ 17 C)boost::anyまたはstd::anyを使用することができます。

#include "iostream" 
#include "boost/any.hpp" 
#include "vector" 

class base { 
protected: 
    int value; 
public: 
    base() : value (0) { } 
    base(int value) : value(value) { } 
}; 

class derived1 : public base { 
public: 
    derived1(int value) : base(value) {}; 
}; 
class derived2 : public base { 
public: 
    derived2(int value) : base(value) {}; 
}; 

template <class T> 
class holder { 
public: 
    holder() {} 
    T* create(int value) { 
     return new T(value); 
    } 
}; 

int main() 
{ 
    std::vector<boost::any> list; 
    holder<derived1> h1; 
    holder<derived2> h2; 
    list.push_back(h1); 
    list.push_back(h2); 
    derived1* pd1 = boost::any_cast<holder<derived1>>(list[0]).create(1); 
    derived2* pd2 = boost::any_cast<holder<derived2>>(list[1]).create(2); 
} 
+0

私は必要なことをするために継ぎ目。 Qtのための 'any'クラスがあることを知っていますか? –

+0

私はそれを聞いていない@ VladShevchenko –

関連する問題