本文介绍了“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);
}
然而,与直接填充成员相比,
解决方案
这是您的编译器重载解析机制或其标准库实现中的错误。
重载解决方案在[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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!