0

所以我试图弄清楚 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]

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

谢谢。

4

5 回答 5

2

成员 _valueType 被声明为指向非 const 对象 (ValueType*) 的指针,而您尝试使用 (&valueType) 初始化的指针是指向 const 对象 (const ValueType*) 的指针,因为您引用了 const 引用。

于 2013-07-31T14:03:35.523 回答
1

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

const ValueType* _valueType;
于 2013-07-31T14:02:56.557 回答
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) {}
};
于 2013-07-31T14:13:13.663 回答
0

您正在尝试将 const 指针分配给非常量指针。

将行更改为:

const ValueType* _valueType;
于 2013-07-31T14:02:52.510 回答
0

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

于 2013-08-01T14:03:22.333 回答