我试图在STL映射中存储从模板化基类派生的对象。但是,尝试插入派生(或实际上是基础)对象将返回:C2440 'initializing' : cannot convert from 'CBase<T> ' to 'CBase<T>'我了解使用派生类是使STL容器异构的一种公认方法(http://www.parashift.com/c++-faq-lite/containers.html#faq-34.4)。我想知道在这种情况下是否可以使用模板。这将非常方便,因为我可以在基类中对在编译时针对各种类型实例化的一系列容器进行单个声明,而不是在非模板派生类中进行重复声明。我的代码如下://Headerusing 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>{ ...};//cppint 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))); 最佳答案 下一行:map<string, CBase<class T>* > m_myMap;几乎可以肯定,这并不意味着您认为的那样。这等效于:map<string, CBase<T>* > m_myMap;也就是说:“T”是一个具体的类,而不是模板参数。这些类之间当然没有关系:CBase<int>和CBase<T>因此,错误消息-您从未定义(或打算)具体的类'T'。使用正确的基数重新获取SCFrench的注释,然后在map 中使用该注释:map<string, CBase<int>* > m_myIntMap;将允许您存储具体的CDerivedInt *对象。如果要存储任何对象,请定义一个完全通用的基础: class CBaseAbc { virtual ~CBaseAbc() = 0; }; template<class T> class CBase : public CBaseAbc { // etc. };map<string, CBaseAbc* > m_myAnthingMap;关于c++ - 模板基类的C++ STL容器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4917440/
10-13 08:26