在VS2013转换操作错误C2678,工作在VS2008(Conversion operator e

2019-10-20 23:28发布

我有一段代码,在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的数据:: PParams”(或没有可接受的转化率)。

而这种代码是成功的双方编译器编译:

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

我该怎么办错了吗?

例如,其再现一个问题: https://www.dropbox.com/s/zjohnu5v87tyr2c/ConstOverload.zip?dl=0

Answer 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引用。 如果有人找到它定义的正式文件,发布的链接在这里请。 希望这个答案将帮助别人。



文章来源: Conversion operator error C2678 in VS2013, works in VS2008