我有一组用于为序列化准备数据的类。所有这些都是从基类派生的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()
,并将该函数中完全相同的代码放入我的 main 中:
cObject obj;
cValue * tmp = new cValue();
tmp->set( 42 );
obj.addAttribure( "The Answer", tmp );
它工作正常。addAttribute()
我认为这与 和函数都是模板化的事实有关set()
,但我不明白如何解决这个问题,或者至少不明白如何解决这个问题。
注意:如果可能的话,我不想让类本身模板化,只有函数。