c ++管理多种数据类型

时间:2013-09-23 14:31:59

标签: c++ templates

您正在开发一个管理多个数据类型的类,因此我创建了一个类包装器,它可以包含各种类型的数据,但是我遇到了编译器问题:

class BaseType{
public:
    virtual ~BaseType(){}
    virtual BaseType & clone() const =0;
};

template<typename T>
class DataType : public BaseType
{
public:
    DataType(const T & aValueData = T()):mValue(aValueData) {}

    BaseType & clone() const
    {
        return DataType<T>();
    }
private:
    T mValue;
};

class MValueData
{
public:
    template<typename T>
    MValueData(T & aAnyValue = DataType(aAnyValue)):mTypeData(aAnyValue)
    {}
private:
    BaseType mTypeData;
};

int main()
{
    return 0;
}

此代码生成以下编译器错误:

error: cannot declare field 'MValueData::mTypeData' to be of abstract type 'BaseType'

mTypeData menber变量被声明为它,但它是从basetype派生的,我没有看到错误。 Thx提前

4 个答案:

答案 0 :(得分:3)

即使您的基类不是抽象的,您仍然会遇到切片问题。

参见例如this answer describing what that means

因此,您需要存储BaseType指针。

答案 1 :(得分:2)

您无法创建类型为抽象的变量。由于BaseType是抽象的(它具有纯虚函数BaseType::clone),因此您无法声明该类型的变量。您可以存储对BaseType的引用或指向BaseType的引用,但不能存储BaseType。

答案 2 :(得分:1)

您不能将mTypeDataBaseType值存储,这将删除对DataType的所有引用;这意味着你将拥有一个抽象类的实例,这是不允许的。

如果您希望将子类存储为其父类,则需要将其存储为BaseType*,然后使用new DataType(aAnyValue)对其进行实例化。

答案 3 :(得分:0)

你不能拥有BaseType的对象,因为它是一个抽象类。