错误:使用模板时无效从“const ...”转换为“...”错误消息

时间:2013-07-31 13:59:23

标签: c++ templates

所以我想弄清楚C ++模板是如何工作的,而且我运气不好。我创建了以下模板:

template<class TValue>
class Value {
public:
    virtual ~Value();

    inline TValue value() const { return _value; }

    virtual int serialize(unsigned char* buffer, int bufferSize) const = 0;

protected:
    Value(TValue value, const ValueType& valueType) : _value(value), _valueType(&valueType) {}

private:
    TValue _value;
    ValueType* _valueType;
};

template<class TValue>
class NumericValue : public Value<TValue> {
protected:
    NumericValue(TValue value, const ValueType& valueType) : Value<TValue>(value, valueType) {}
};

然后我有一个我创建的课程:

class U16Value : public NumericValue<u16> {
public:
    U16Value(u16 value) : NumericValue<u16>(value, ValueType::U16) {}
}

不幸的是,这不会编译。我在这一行收到错误:

Value(TValue value, const ValueType& valueType) : _value(value), _valueType(&valueType) {}

那说:

error: invalid conversion from const tnp::ValueType* to tnp::ValueType* [-fpermissive]

有人可以告诉我为什么会这样吗?

感谢。

5 个答案:

答案 0 :(得分:2)

成员_valueType被声明为非const对象(ValueType *)的指针,并且您尝试初始化的指针(&amp; valueType)是指向const对象的指针(const ValueType *),因为您引用了一个const参考。

答案 1 :(得分:1)

您的构造需要const并尝试将其存储在无const var中。从该行中删除const或将其添加到vars声明中。

const ValueType* _valueType;

答案 2 :(得分:0)

您正在尝试将const指针指定给非const指针。

将行更改为:

const ValueType* _valueType;

答案 3 :(得分:0)

我真的不了解ValueType,它是否存在?但我认为你想做这样的事情:

template<class TValue>
class Value {
public:
    typedef TValue ValueType;
    virtual ~Value();

    inline TValue value() const { return _value; }

    virtual int serialize(unsigned char* buffer, int bufferSize) const = 0;

protected:
    Value(TValue value) : _value(value) {}

private:
    TValue _value;
};

template<class TValue>
class NumericValue : public Value<TValue> {
public:
    typedef typename Value<TValue>::ValueType ValueType;
protected:
    NumericValue(TValue value) : Value<TValue>(value) {}
};

class U16Value : public NumericValue<u16> {
public:
    U16Value(ValueType value) : NumericValue<ValueType>(value) {}
};

答案 4 :(得分:0)

我通过简单地让每个派生类返回自己的ValueType对象而不是将其填充到父类中来解决问题。这似乎给了我正在寻找的东西。