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

コンストラクトは を取り、constそれを none constvar に格納しようとします。その行から削除するかconst、vars 宣言に追加してください。

const ValueType* _valueType;
于 2013-07-31T14:02:56.557 に答える
0

const ポインターを非 const ポインターに割り当てようとしています。

行を次のように変更します。

const ValueType* _valueType;
于 2013-07-31T14:02:52.510 に答える