我尝试使用普通的std :: list编译一些自定义分配器的代码时发现了一个奇怪的行为。请考虑以下代码:
std::list<int, std::allocator<int>> theList;
theList.push_back(1);
这是一个正常的列表变量,其中添加了一些数据。现在,如果我将其切换为:
std::list<int, std::allocator<int>> theList(std::allocator<int>());
theList.push_back(1);
Visual Studio 2012无法编译它“错误C2228:'。put_back'的左边必须有class / struct / union”。当然std :: list有一个构造函数,它对分配器进行const引用。但如果我把它改为:
std::list<int, std::allocator<int>> theList = std::list<int, std::allocator<int>>(std::allocator<int>());
theList.push_back(1);
一切都很好。为什么第二部分失败了?为了增加这种情况的陌生感,当试图按值返回List时:
typedef std::list<int, std::allocator<int>> TempType;
TempType func()
{
TempType theList(std::allocator<int>());
return theList;
}
我得到“错误C2664:'std :: list&lt; _Ty,_Alloc&gt; :: list(const std :: list&lt; _Ty, Alloc&gt;&amp;)':无法从'TempType(<)中转换参数1 / em> _cdecl *)(std :: allocator&lt; Ty&gt;( _cdecl *)(void))'到'const std :: list&lt; _Ty,_Alloc&gt;&amp;'“。看起来编译器将列表视为函数声明。知道为什么会这样吗?
答案 0 :(得分:5)
您已遇到the most vexing parse。编译器将theList(std::allocator<int>())
的定义解析为函数声明。这应该可以帮到你:
std::allocator<int> alloc;
std::list<int, std::allocator> > theList(alloc);
答案 1 :(得分:3)
您不小心声明了功能。添加一组额外的括号将使其明确无误。
std::list<int, std::allocator<int>> theList((std::allocator<int>()));
// ^ ^