テンプレート化された基本クラスから派生したオブジェクトを STL マップに格納しようとしています。ただし、派生 (または実際にはベース) オブジェクトを挿入しようとすると、以下が返されます。
C2440 'initializing' : cannot convert from 'CBase<T> ' to 'CBase<T>'
派生クラスの使用は、STL コンテナーを異種混合にする方法の 1 つとして認められていることを理解しています (http://www.parashift.com/c++-faq-lite/containers.html#faq-34.4)。このコンテキストでテンプレートを使用できるかどうかを知りたいです。テンプレート化されていない派生クラスで重複した宣言を行う代わりに、コンパイル時にさまざまな型に対してインスタンス化される、基本クラスでコンテナーの範囲の宣言を 1 つ持つことができるので、非常に便利です。
私のコードは次のとおりです。
//Header
using namespace std;
template<class T>
class CBase
{
public:
CBase::CBase() {};
virtual CBase::~CBase() {};
vector<pair<int, T> > RetrieveVect() { return vect; };
private:
vector<pair<int, T> > vect;
};
class CDerivedString : public CBase<string>
{
...
};
class CDerivedInt : public CBase<int>
{
...
};
//cpp
int main(void)
{
//Map specialised for pointer to base class
map<string, CBase<class T>* > m_myMap;
string s = "key";
//Create and insert object (base class)
CBase<int> *dataInt = new CBase();
//The following results in error C2440: 'initializing' : cannot convert from 'CBase<T> ' to 'CBase<T>
m_myMap.insert(std::make_pair(s, dataInt));
//Create and insert object (derived class)
CBase<int> *dataBase = new CBase<int>();
//The following results in error C2440: 'initializing' : cannot convert from 'CBase<T> ' to 'CBase<T>
m_myMap.insert(pair<string, CBase<class T>* >(s, static_cast<CBase*>(dataInt)));
}
派生クラス ポインターで dynamic_cast を実行して、基本ポインター型にキャストしようとしましたが、これも機能しませんでした。
//error C2440: 'static_cast' : cannot convert from 'CBase<T> *' to 'CBase<T> *'
m_myMap.insert(pair<string, CBase<class T>* >(s, static_cast<CBase<class T>*>(dataInt)));