好吧,标题是一个满口,希望足够具体,但我遇到了一个C++问题,我认为这是可能的,我似乎无法找到正确的语法。基于类型名称重载专门的赋值运算符
我有一个简单的基于模板的性能等级:
template <typename T>
class Property
{
public:
Property<T> &operator = (const T &src)
{
m_data = src;
return *this;
};
operator const T&() const
{
return m_data;
}
private:
T m_data;
};
我需要从一个QVariant,这也是种类的财产,但没有模板赋值。目前,我分配时明确deferencering值:
Property<QString> p1;
Property<int> p2;
p1 = var1.toString();
p2 = var2.toInt();
这工作,但它是单调乏味的,我敢肯定,编译器能为我做的工作。所以,我试图根据这个属性的typename来实现专门的赋值运算符;换句话说,如果模板专业化是基于一个QString使用一个函数,如果它基于一个int使用另一个函数,等等。
我试过的东西:
Property<QString> &operator = (const QVariant &ref)
{
m_data = ref.toString();
return *this;
};
或...
template <typename int> &Property<int>::operator = (const QVariant &ref)
{
m_data = ref.toInt();
return *this;
};
或...
template<> Property<T> &Property<QString>::operator = (const QVariant &ref)
{
m_data = ref.toString();
return *this;
}
..both内和类声明之外,但要徒劳无功。我收到诸如“预期的嵌套名称说明符”,“参数声明中的两个或多个数据类型”等错误。
任何指向正确语法的指针将不胜感激!
PS:第一个声明编译时没有错误,但为<int>添加相同的声明使其不明确,因为只有返回类型不同。
编译器是GCC 4.8.2,启用了--stdc = C++ 11。
尝试'Property&operator =(const T&src)'而不是'Property&operator =(const T&src)'。 –
不是你的主要问题,但建议'operator const T&()const&'(将ref-qualifier加到最后),这样可以减少创建没有警告的悬空引用的风险 –