我有一組類用於爲序列化準備數據。所有這些都來自基類cBase
,它不包含與問題相關的任何內容。在派生類中的模板存在問題
在派生類有:
class cValue: public cBase
{
public:
cValue(){}
template< class T > void set(const T & value){ data_ = value; }
protected:
QVariant data_;
};
這是用於保持簡單值像字符串或數字的類。這裏是一個類來表示一個對象(基本的東西,可以持「名稱 - 值」對:
class cObject: public cBase
{
public:
cObject(){}
void addAttribure(const QString & name, cBase * value)
{
if(attributes_.contains(name))
delete attributes_[name];
attributes_[name] = value;
}
template< class T > void addAttribure(const QString & name, const T & value)
{
cValue * tmp = new cValue();
tmp->set(value);
addAttribure(name, tmp);
}
protected:
QMap< QString, cBase * > attributes_;
};
這樣做的目的是爲了能夠既與已經創建的對象添加屬性:addAttribute(someName, someObject);
與原始值:addAttribute("name", 42);
現在,因爲它是,這段代碼編譯不過,如果我嘗試創建這樣一個對象:
cValue *tmp = new cValue();
tmp->set(42);
cObject obj;
obj.addAttribure("The Answer", tmp);
,我發現了以下錯誤:
/usr/include/qt4/QtCore/qvariant.h:429:12: error: 'QVariant::QVariant(void*)' is private
../../source/private/../include/MyClasses.h:36:51: error: within this context
錯誤出現在cValue
的set()
函數聲明的行上。 現在,如果我從功能去除addAttribute()
的模板版本,然後將完全相同的代碼到我的主:
cObject obj;
cValue * tmp = new cValue();
tmp->set(42);
obj.addAttribure("The Answer", tmp);
它工作正常。我認爲它與addAttribute()
和set()
函數都是模板化的事實有關,但我無法理解如何解決此問題,或至少如何制定解決方法。
注:如果可能的話,我想不使自己的模板類,只有功能。
難道這是一個含糊不清的問題,因爲'addAttribure(常量QString的& name,cBase * value)'與'addAttribure(const QString&name,const T&value)'相同時''T == cBase *'。如果你明確指出'tmp-> set(42)'? –
cmannett85
@ cmannett85,你幾乎是對的,這確實是一個模糊的問題,但我不得不改變的路線是'addAttribure(name,tmp);'在模板化的'addAttribute()'函數中,我用一個更明確的' addAttribure(名稱,static_cast(tmp));'。現在正在工作。發佈這個答案,我會接受它。 –
SingerOfTheFall