VS2013中的转换运算符错误C2678适用于VS2008

时间:2014-09-13 00:55:30

标签: c++ visual-studio-2013 operator-overloading

我有一段代码在VS2008中成功编译,无法在VS2013中编译。

有一个类Data::CData,它是一个变体类型的实现。它有一个转换运算符重载:

template<class T> T&        GetValue();
template<class T> const T&  GetValue() const;
template<class T> operator T&() { return GetValue<T>(); }
template<class T> operator const T&() const { return GetValue<T>(); }

产生错误的代码是

Data::CData Val;
Data::PParams Prm = (const Data::PParams&)Val;

错误是:错误C2678:二进制'=':找不到运算符,它接受类型为'const Data :: PParams'的左手操作数(或者没有可接受的转换)。

这两个编译器成功编译了这段代码:

Data::CData Val;
Data::PParams Prm = Val.operator const Data::PParams&();

我做错了什么?

重现问题的示例:https://www.dropbox.com/s/zjohnu5v87tyr2c/ConstOverload.zip?dl=0

1 个答案:

答案 0 :(得分:1)

我终于得到了解决方案! 而不是我过去的两个操作员重载

template<class T> operator T&() { return GetValue<T>(); }
template<class T> operator const T&() const { return GetValue<T>(); }

应该有

template<class T> operator T&() { return GetValue<T>(); }
template<class T> operator const T&() { return GetValue<T>(); }
template<class T> operator const T&() const { return GetValue<T>(); }

因此,在VS2013中,我们还需要一个专用的运算符来从非const对象获取const引用。如果有人找到定义它的官方文档,请在此处发布链接。希望这个答案能够帮助他人。