C++ 类型间转换

C++ 类型间转换,c++,casting,abstraction,C++,Casting,Abstraction,我有一个用于序列化数据的抽象类,如下所示 template<class T> class Serialize{ public: virtual string serialize() = 0; virtual T deSerialize(string value) = 0; } 模板 类序列化{ 公众: 虚拟字符串序列化()=0; 虚拟T反序列化(字符串值)=0; } 我还有一个数据模型a class PersonModel: public

我有一个用于序列化数据的抽象类,如下所示

template<class T>
class Serialize{
    public:
       virtual string serialize() = 0;
       virtual T deSerialize(string value) = 0;
 }
模板
类序列化{
公众:
虚拟字符串序列化()=0;
虚拟T反序列化(字符串值)=0;
}
我还有一个数据模型a

 class PersonModel: public Serialize<PersonModel> {
       ...
       public:
           ...
           string serialize() { return "The serialized form";}
           T deSerialize(string value) {return PersonModel();}
  }
class PersonModel:public序列化{
...
公众:
...
string serialize(){返回“序列化的表单”;}
T反序列化(字符串值){return PersonModel();}
}
现在我有一个通用上下文类,如下所示:

 template<class T>
 class DC{
     private:
        vector<T> data;
     public:
        vector<string> read(){
            for each(auto i in data){
                Serialize<T> *getSerializedData = dynamic_cast<Serialize<T>*>(i);
            }
        }
模板
DC类{
私人:
矢量数据;
公众:
向量读取(){
对于每个(自动输入数据){
Serialize*getSerializedData=dynamic_cast(i);
}
}
C++显示上述转换的以下错误:

错误C2682无法使用“dynamic_cast”将“PersonModel”转换为 “
序列化*


如何解决这个问题?

假设您将
DC
的实例声明为
DC
,错误很明显:您无法将-指针对象转换为指向该对象的指针(或指向基类的指针)

而是循环引用,实际上不需要执行任何强制转换:

for (auto& i : data){
    // i is a reference which makes polymorphism work
    // i also "is-a" Serialize<PersonModel> object reference due to the inheritance
    i.serialize();  // Will work just fine, no casting needed
}
for(自动和输入:数据){
//我是一个参考,使多态性的工作
//由于继承,我还“是一个”序列化对象引用
i、 serialize();//工作正常,无需强制转换
}

@LogicStuff:static_cast也显示了同样的错误。问题似乎缺少一些关键信息,请创建一个并向我们展示。foreach循环的语法是什么?@JoachimPileborg不,不是,C++11 foreach循环在中没有使用kewords
。为什么人们即使在他们问的是一个编译错误?我不明白。它显示了完全相同的错误,我已经在发布问题之前尝试过了。@ Arrr它不能,除非你非法地从非指针对象中非法地指向一个指针。不要进行转换,这是不需要的。因为C++,所以它是不需要的。C++没有在高层次上有泛型约束。@ AARRR,那么问题就缺少了一些关键信息,为什么你需要抛出?你实际上在循环中做什么?@ Arrr,你肯定正在做一些你不给我们展示的东西。<代码>人物模型< /C> >是<代码>序列化< /C>,它甚至有<代码> Seri。ILITIO/C++ >函数被重写,所以如果编译器说它没有找到那个函数,那么你就做了你没有告诉我们的事情。