在VS2008中编译的代码在VS2013中没有,const重载

时间:2014-09-06 00:53:27

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

现在我正在将我的项目从Visual Studio 2008迁移到2013(没有安装更新),并且遇到问题。 我有一种Variant类型CData< T>,它有一个包含类型T的转换运算符。

template<class T> T&        GetValue();
template<class T> const T&  GetValue() const;
template<class T> T*        GetValuePtr();
template<class T> const T*  GetValuePtr() const;

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

CDataArray类中有方法:

CData&          Get(int Index) { return At(Index); }
const CData&    Get(int Index) const { return operator [](Index); }
template<class T>
T&              Get(int Index) { return At(Index).GetValue<T>(); }
template<class T>
const T&        Get(int Index) const { return operator [](Index).GetValue<T>(); }

并打电话给它:

Data::PDataArray SGQuests;
Data::PParams SGQuest = SGQuests->Get(i);

这里,Data :: PParams将成为T. 在VS2008中,它似乎使用了非const非模板CDataArray :: Get(),它返回了CData&amp;,然后是这个CData&amp;使用非const模板运算符T&amp;()访问,最后返回Data :: PParams&amp;。

在VS2013中,由于某种原因,它使用了const重载并导致错误:

1>PATH_TO_SRC\l1\data\type.h(126): error C2678: binary "=": no operator found that accepts left operand "const Ptr<Data::CParams>" (or there is no acceptable conversion)
1>          PATH_TO_SRC\l1\data\ptr.h(29): may be "void Ptr<Data::CParams>::operator =(T *)"
1>          with
1>          [
1>              T=Data::CParams
1>          ]
1>          PATH_TO_SRC\l1\data\ptr.h(28): or       "void Ptr<Data::CParams>::operator =(const Ptr<Data::CParams> &)"
1>          trying to match argument list "(const Ptr<Data::CParams>, const Ptr<Data::CParams>)"
1>          PATH_TO_SRC\l1\data\type.h(125): compiling member function "void Data::CTypeImpl<T>::Copy(void **,void *const *) const" template class
1>          with
1>          [
1>              T=const Ptr<Data::CParams>
1>          ]
1>          PATH_TO_SRC\l1\data\data.h(167):  "Data::CTypeImpl<T>"
1>          with
1>          [
1>              T=const Ptr<Data::CParams>
1>          ]
1>          PATH_TO_SRC\l1\data\data.h(97):  "T &Data::CData::GetValue<T>(void)"
1>          with
1>          [
1>              T=const Ptr<Data::CParams>
1>          ]
1>          PATH_TO_SRC\l3\quests\questmanager.cpp(307):  "Data::CData::operator const T(void)<const Ptr<Data::CParams>>"
1>          with
1>          [
1>              T=const Ptr<Data::CParams>
1>          ]

我手动将消息翻译成英文,因此它们可能与原始EN编译器消息略有不同。

最后,如果我写出明确的模板参数:

Data::PParams SGQuest = SGQuests->Get<Data::PParams>(i);

编译好。

问题是:

  1. VS2013模板参数猜测与VS2008的区别如何?是否有任何地方(标准,文章或smth)清楚地解释,为什么我的旧代码不应该编译?任何参考将不胜感激。
  2. 在这种情况下我应该如何编写代码?我现在必须明确地编写模板参数,或者只是修改成员重载,还是安装一些更新?
  3. P.S。 https://www.dropbox.com/s/zjohnu5v87tyr2c/ConstOverload.zip?dl=0提供最少的代码。完整的源代码是 https://code.google.com/p/deusexmachina/source/browse/branches/Dev/DEM/Src

1 个答案:

答案 0 :(得分:0)

通过向CData添加第三次重载来解决此问题

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

原始解决方案发布于: Conversion operator error C2678 in VS2013, works in VS2008

查看可能的更多详细信息。