现在我正在将我的项目从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);
编译好。
问题是:
P.S。 https://www.dropbox.com/s/zjohnu5v87tyr2c/ConstOverload.zip?dl=0提供最少的代码。完整的源代码是 https://code.google.com/p/deusexmachina/source/browse/branches/Dev/DEM/Src
答案 0 :(得分:0)
通过向CData添加第三次重载来解决此问题
template<class T> operator const T&() { return GetValue<T>(); }
原始解决方案发布于: Conversion operator error C2678 in VS2013, works in VS2008
查看可能的更多详细信息。