我无法理解错误。我正在使用一个简单的向量映射(用字符串键入并存储字符串向量):
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
都不是一个空字符串向量吗?
答案 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