pdm*_*011 1 c++ templates base-class
我试图在STL映射中存储从模板化基类派生的对象.但是,尝试插入派生(或实际上是基础)对象会返回:
C2440 'initializing' : cannot convert from 'CBase<T> ' to 'CBase<T>'
Run Code Online (Sandbox Code Playgroud)
我理解使用派生类是使STL容器异构的一种可接受的方式(http://www.parashift.com/c++-faq-lite/containers.html#faq-34.4).我想知道是否可以在此上下文中使用模板.这将非常方便,因为我可以在基类中单个声明一系列容器,这些容器在编译时为我的各种类型实例化,而不是在非模板化派生类中重复声明.
我的代码如下:
//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)));
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试对派生类指针执行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)));
Run Code Online (Sandbox Code Playgroud)
以下行:
map<string, CBase<class T>* > m_myMap;
Run Code Online (Sandbox Code Playgroud)
几乎可以肯定并不意味着你的想法.这相当于:
map<string, CBase<T>* > m_myMap;
Run Code Online (Sandbox Code Playgroud)
那就是:'T'是一个具体的类,而不是模板参数.当然,课程之间没有任何关系:
CBase<int>
Run Code Online (Sandbox Code Playgroud)
和
CBase<T>
Run Code Online (Sandbox Code Playgroud)
因此错误消息 - 您从未定义(或打算)具体类'T'.使用正确的基数重新获取SCFrench的评论,然后在地图<>中使用它:
map<string, CBase<int>* > m_myIntMap;
Run Code Online (Sandbox Code Playgroud)
将允许您存储具体的CDerivedInt*对象.如果要存储任何对象,请定义完全通用的基础:
class CBaseAbc
{
virtual ~CBaseAbc() = 0;
};
template<class T>
class CBase : public CBaseAbc
{
// etc.
};
map<string, CBaseAbc* > m_myAnthingMap;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5160 次 |
| 最近记录: |