1

在尝试使用带有自定义分配器的普通 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:'.push_back' 左侧必须有类/结构/联合”。当然 std::list 有一个构造函数,它接受对分配器的 const 引用。但是,如果我将其更改为:

std::list<int, std::allocator<int>> theList = std::list<int, std::allocator<int>>(std::allocator<int>());
theList.push_back(1);

一切皆好。为什么第二部分失败了?为了增加情况的奇怪之处,当尝试按值返回列表时:

typedef std::list<int, std::allocator<int>> TempType;

TempType func()
{
    TempType theList(std::allocator<int>());
    return theList;
}

我得到“错误 C2664: 'std::list<_Ty,_Alloc>::list(const std::list<_Ty, Alloc> &)' : cannot convert parameter 1 from 'TempType ( _cdecl *)(std::allocator < Ty> ( _cdecl *)(void))' 到 'const std::list<_Ty,_Alloc> &'”。看起来编译器将列表视为函数声明。知道为什么会这样吗?

4

2 回答 2

5

您遇到了最令人头疼的 parse。编译器将 的定义解析theList(std::allocator<int>())为函数声明。这应该可以解决您的问题:

std::allocator<int> alloc;
std::list<int, std::allocator> > theList(alloc);
于 2013-04-17T19:35:40.263 回答
3

它被称为最令人头疼的解析

你不小心声明了一个函数。添加一组额外的括号将使其明确。

std::list<int, std::allocator<int>> theList((std::allocator<int>()));
//                                          ^                     ^
于 2013-04-17T19:34:16.737 回答