为什么括号在初始化空向量时会有所不同?

时间:2013-04-26 14:34:46

标签: c++ stl compiler-errors

我无法理解错误。我正在使用一个简单的向量映射(用字符串键入并存储字符串向量):

typedef std::map<std::string, std::vector<std::string> > TRouteMarkets;

以下代码(剥离),

void CFoo::Bar(const char* route, const char* market)
{
    // ...

    TRouteMarkets::key_type key(route);
    TRouteMarkets::mapped_type mapped();
    TRouteMarkets::value_type pair(key, mapped);

    // ...
}

产生以下错误:

  

“Foo.cc”,第518行:错误:无法找到std :: pair&lt; const std :: string,std :: vector&lt; std :: string&gt;&gt; :: pair(const std: :string,std :: vector&lt; std :: string&gt;())在CFoo :: Bar(const char *,const char *)中需要。

但是从地图中删除()

TRouteMarkets::mapped_type mapped;

修正错误。为什么?在这两种情况下,mapped都不是一个空字符串向量吗?

2 个答案:

答案 0 :(得分:7)

这实际上是一个函数声明:

TRouteMarkets::mapped_type mapped();

声明名为mapped的函数,该函数不接受任何参数并返回TRouteMarkets::mapped_type

答案 1 :(得分:5)

您遇到了Most Vexing Parse问题。

TRouteMarkets::mapped_type mapped();

上面一行声明了一个名为mapped的函数,该函数不带参数并返回TRouteMarkets::mapped_type类型的对象。

使用C ++ 11,您可以使用统一初始化语法来避免此问题。

TRouteMarkets::mapped_type mapped{}; // Not a function declaration anymore