我有一段代码在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
答案 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引用。如果有人找到定义它的官方文档,请在此处发布链接。希望这个答案能够帮助他人。