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

And*_*ong 5 c++ stl compiler-errors

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

typedef std::map<std::string, std::vector<std::string> > TRouteMarkets;
Run Code Online (Sandbox Code Playgroud)

以下代码(剥离),

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

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

    // ...
}
Run Code Online (Sandbox Code Playgroud)

产生以下错误:

"Foo.cc",第518行:错误:无法找到std :: pair <const std :: string,std :: vector <std :: string >> :: pair(const std :: string,std)的匹配项:: vector <std :: string>())在CFoo :: Bar(const char*,const char*)中需要.

但是删除了()映射,

TRouteMarkets::mapped_type mapped;
Run Code Online (Sandbox Code Playgroud)

修复错误.为什么?mapped在任何一种情况下都不是一个空字符串向量?

hmj*_*mjd 7

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

TRouteMarkets::mapped_type mapped();
Run Code Online (Sandbox Code Playgroud)

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


Pra*_*ian 5

你遇到了最烦恼的解决问题.

TRouteMarkets::mapped_type mapped();
Run Code Online (Sandbox Code Playgroud)

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

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

TRouteMarkets::mapped_type mapped{}; // Not a function declaration anymore
Run Code Online (Sandbox Code Playgroud)

  • 这不是最令人烦恼的解析. (3认同)
  • 最令人烦恼的解析更令人烦恼. (3认同)
  • @Praetorian,我不这么认为.令人烦恼,但并非最令人烦恼.:) (2认同)