2013-07-31 33 views
0

所以我想弄清楚C++模板是如何工作的,而且我沒有太多的運氣。我創建了以下模板:錯誤:使用模板時從「const ...」無效轉換爲「...」錯誤消息

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] 

一些能告訴我,爲什麼發生這種情況?

謝謝。

+2

不允許從'const T *'轉換爲'T *'。它會打破const修飾符,因爲你可能無意中通過指向非const的指針來改變const對象。 '_valueType'成員的目的是什麼? – jrok

+0

_valueType定義對象的值的類型。數字對象提供轉換例程以轉換爲不同的數據類型並從中轉換。 – DaveR

+0

也許我誤解了你的意圖,但是你不需要一個數據成員來記住一個模板參數:o除非你想保持運行時的信息。 – jrok

回答

0

您正在嘗試將常量指針指定給非常量指針。

行更改爲:

const ValueType* _valueType; 
1

你的結構需要一個const並改掉將其存儲在一個沒有const變種。從該行刪除const或將其添加到變量聲明中。

const ValueType* _valueType; 
2

成員_valueType被聲明爲指向非const對象(ValueType的*),並嘗試使用並初始化指針(& VALUETYPE)是指向const對象(const的值類型*),因爲你引用一個const引用。

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) {} 
}; 
+0

這不會工作,因爲沒有「價值」。這些對象保存一個值,ValueType對象告訴它它是什麼類型的值。讀取/寫入字節流需要使用值類型。 – DaveR

0

我通過簡單地讓每個派生類的解決了這個問題返回自己的值類型對象,而不是在父類餡吧。這似乎給了我我正在尋找的東西。

相關問題