本文介绍了“C2593:operator = is ambiguous”当填充std :: map的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 std :: map 我试图初始化初始化列表。我在两个地方做这个,有两种不同的方式。



这是一个工作原理:

  void foo(){
static std :: map< std :: string,std :: string> fooMap =
{
{First,ABC},
{Second,DEF}
};
}

虽然这不是:

  class Bar {
public:
Bar();
private:
std :: map< std :: string,std :: string> barMap;
};

Bar :: Bar(){
barMap = {//< - 这是错误行
{First,ABC},
{Second,DEF}
};
}

为什么在尝试初始化类成员时会出现错误,静态地图工程?现在,我可以通过首先创建一个局部变量,然后与成员交换它来填充成员,例如:

  :: Bar(){
std :: map< std :: string,std :: string> tmpMap = {
{First,ABC},
{Second,DEF}
};

barMap.swap(tmpMap);
}

然而,与直接填充成员相比,






编辑:这是编译器输出。 / a>

这是您的编译器重载解析机制或其标准库实现中的错误。
重载解决方案在[over.ics.rank] / 3中清楚地说明

Here, X is std::pair<std::string, std::string>. L1 converts your list to the parameter of

map& operator=( std::initializer_list<value_type> ilist );

Whilst L2 converts the list to one of the following functions' parameters:

map& operator=( map&& other );
map& operator=( const map& other );

Which clearly aren't initializer_lists.


You could try to use

barMap = decltype(barMap){
    { "First", "ABC" },
    { "Second", "DEF" }
};

Which should select the move-assignment operator (Demo with VC++). The temporary should also be optimized away according to copy elision.

这篇关于“C2593:operator = is ambiguous”当填充std :: map的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-10 19:37