2013-04-26 76 views
5

我无法理解错误。我正在与载体的直接映射工作(由字符串键控和存储串的矢量):为什么在初始化空向量时圆括号有所作用?

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", line 518: Error: Could not find a match for std::pair<const std::string, std::vector<std::string>>::pair(const std::string, std::vector<std::string>()) needed in CFoo::Bar(const char*, const char*).

但除去()从映射,

TRouteMarkets::mapped_type mapped; 

修复了错误。为什么?两种情况下,是不是mapped是一个空字符串向量?

+4

阅读[最令人头疼的解析](http://en.wikipedia.org/wiki/Most_vexing_parse)。 – 2013-04-26 14:37:51

+0

我们真的需要一个自动检查器来解决烦恼的解析和家庭问题。我从问题标题中得到了一个很好的想法,它会经常出现(c: – 2013-04-26 14:49:34

+3

这不是最令人头疼的解析方法 – hmjd 2013-04-26 14:50:50

回答

7

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

TRouteMarkets::mapped_type mapped(); 

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

5

您已遇到Most Vexing Parse问题。

TRouteMarkets::mapped_type mapped(); 

上述行声明名为mapped函数,它没有参数和返回TRouteMarkets::mapped_type类型的对象。

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

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

啊,一切都清楚了;不能相信我从未遇到过这个问题!谢谢,并且向@hmjd和@@ JoachimPileborg致歉,只有一个可以授予 – 2013-04-26 14:51:17

+3

这不是最令人头痛的解析 – hmjd 2013-04-26 14:52:28

+0

@hmjd最近怎么样? – Praetorian 2013-04-26 15:02:08