我有以下两个在模板类和容器中定义的结构,它包含基类的元素,如下所示:
class template<typename T1, typename T2>
class TTestDataObject
{
private:
//base element
struct SDataContainerElement
{
T1* m_sData;
};
//derived element
struct SInvalidDataContainerElement : SDataContainerElement
{
int m_eExpectedErrorCode;
};
//container holding base elements
typedef std::map<T2, SDataContainerElement* > TDataContainer;
TDataContainer sCInvalidData;
public:
typedef TDataContainer::const_iterator TDataConstIterator;
}
我想实现一个方法,它可以从这个容器中提取信息,根据它有哪个元素,基类(SDataContainerElement)或派生类(SInvalidDataContainerElement)做不同的事情,我按如下方式实现:
template<typename TDataStruct, typename TDataEnum>
int TTestDataObject<T1, T2>::eGetExpectedError(T2 eIndex)
{
TDataConstIterator sElement = sCInvalidData.find(eIndex);
if(dynamic_cast<SInvalidDataContainerElement*>((sElement->second)) == NULL)
return -1;
else
return static_cast<int>(sElement->second->m_eExpectedError);
}
尝试编译会导致以下错误:
E2307 Type'TTestDataObject<BEREICHTYP,eTestDataBereichTyp>::SDataContainerElement' is not a defined class with virtual functions
我不明白这一点。任何人都可以向我解释这个错误,并向我展示一个解决方案吗?
提前致谢!
答案 0 :(得分:0)
如FAQ: Why does dynamic_cast only work if a class has at least 1 virtual method?中所述,我需要在基类中使用虚拟方法,如虚拟析构函数。
要使此代码正常工作,我只需添加
virtual ~SDataContainerElement(){};
到base - struct。谢谢!