gpt4 book ai didi

用于模板基类的 C++ STL 容器

转载 作者:行者123 更新时间:2023-11-30 00:40:57 25 4
gpt4 key购买 nike

我正在尝试将派生自模板化基类的对象存储在 STL 映射中。但是,尝试插入派生(或实际上是基础)对象会返回:

C2440 'initializing' : cannot convert from 'CBase<T> ' to 'CBase<T>'

我知道使用派生类是使 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)));
}

我已经尝试对派生类指针执行 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++ STL 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4917440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com