【问题标题】:Error C2593: Operator = is ambiguous错误 C2593:运算符 = 不明确
【发布时间】:2010-11-03 06:21:00
【问题描述】:
typedef map<wstring , IWString> REVERSETAG_CACHE ;
REVERSETAG_CACHE::iterator   revrsetagcacheiter;
.
.
.
wstring strCurTag;
strCurTag =  revrsetagcacheiter->second; //Error C2593

错误 C2593:运算符 = 不明确

为什么上面的赋值会出现这个错误?它适用于VC6。不能在 VC9 中编译。

【问题讨论】:

  • 请给出完整的错误信息。它至少应该说明可能的呼叫候选人。或者它真的只是说“它是模棱两可的”?
  • 这正是错误所说的。错误 C2593:运算符“=”不明确。

标签: c++ visual-studio-2008 porting visual-c++-6 wstring


【解决方案1】:

据推测,VC6 允许应用多个用户定义的转换,而(正确地)VC9 不允许。看看C++ implicit conversions 讨论一般问题。

一般的解决方案是自己提供所需的转换,而不是让编译器尝试去做。

【讨论】:

    【解决方案2】:

    revrsetagcacheiter-&gt;secondIWString 类型。 因此它不会编译。我认为它也不会在 VC6 中编译。

    我会再试一次:你的 BasicString 类是 c_str() 方法吗?如果是这样,请尝试使用 std::wstring str(iter-&gt;second.c_str());

    将其转换为 wstring

    【讨论】:

    • 能否提供IWString的定义。我怀疑 VC6 正在执行多个隐式转换,以按照 Neil 的建议从 IWString 创建一个 wstring。
    • typedef BasicString > IWString;
    • 如果您能告诉我如何从 IWString 转换为 wstring 也会有所帮助。
    • 我建议这样做: IWString iWstr = revrsetagcacheiter->second ; std::wstring strCurTag = iWstr; (我希望这是直接转换)
    • 这不是原来的问题吗? std::wstring strCurTag = iWstr;
    【解决方案3】:

    尝试将您分配的内容转换为正确的类型。

    如:

    strCurTag =  (wstring)revrsetagcacheiter->second;
    

    更好的是,您的意思可能是:

    IWstring strCurTag;
    

    【讨论】:

      【解决方案4】:

      您通常应该避免隐式转换,即让您的所有分配在一侧和另一侧使用完全相同的类型,尤其是当知道涉及哪些类型很简单时。依赖或试图依赖隐式转换不是一个好主意。

      如果:

      strCurTag =  static_cast<wstring>(revrsetagcacheiter->second);
      

      不编译,那我们应该开始考虑问题了。

      【讨论】:

      • 不起作用。它说错误 C2243: 'type cast' : 从 'std_ex::IWString *' 到 'const std::allocator<_ty> &' 的转换存在,但无法访问。
      • 我放弃了。我想我只需将 strCurTag 更改为 IWString。你能告诉我如何将 IWstring 转换为 wstring 吗?以下是IWstring c_str、bstr....等的成员
      • 对不起,我不熟悉这些类型。使用替代类型有什么变化吗?最终,所有字符串类型都应该能够为您提供它们的字符序列,对吧?
      猜你喜欢
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多