此代码的工作:功能VS在C++变量声明
std::ifstream f(mapFilename.c_str());
std::string s = std::string(std::istreambuf_iterator<char>(f), std::istreambuf_iterator<char>());
ParseGameState(s);
。由此mapFilename
是std::string
和void ParseGameState(const std::string&);
。
这并不:
std::ifstream f(mapFilename.c_str());
std::string s(std::istreambuf_iterator<char>(f), std::istreambuf_iterator<char>());
ParseGameState(s);
这是错误:
game.cpp: In member function ‘int Game::LoadMapFromFile(const std::string&)’:
game.cpp:423: error: no matching function for call to ‘ParseGameState(std::string (&)(std::istreambuf_iterator<char, std::char_traits<char> >, std::istreambuf_iterator<char, std::char_traits<char> > (*)()))’
game.cpp:363: note: candidates are: ParseGameState(const std::string&)
如此看来,它承认s
为函数声明,而不是在这种情况下,一个变量声明。
这是为什么?这是GCC 4.2.1(Apple版本)中的错误吗?或者GCC是否正确处理这个问题?这是不是在C++标准中定义?
谢谢! [这里在WP](http://en.wikipedia.org/wiki/Most_vexing_parse)也是关于最令人头痛的解析的一个很好的解释。 – Albert 2010-09-12 16:14:29
看起来上面的'std :: string'变量声明在C++ 0x中不起作用:因为'std :: string'有一个初始化列表构造函数,整个'{...}'将被视为单个参数,并将尝试初始化'initializer_list'参数并且无法编译:( –
2010-09-12 23:21:40
@Johannes:是的,我认为你是对的,我想知道它是否会更好如果这是重新编写的,而不是考虑一个列表初始化程序,然后(只有当它不存在时)考虑其他ctors,如果相反它只是构建了一个超载集并选择了一个最佳匹配 - 可能与创建一个小调整initializer_list相当于没有转换关于匹配的好处(条件是我只考虑了几分钟,以便可能会导致我错过的微妙(甚至是明显的)问题)。 –
2010-09-12 23:48:51