【发布时间】:2012-02-14 05:21:37
【问题描述】:
考虑这个例子:
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
int main()
{
std::string sen = "abc def ghi jkl";
std::istringstream iss(sen);
std::vector<std::string> // declaration in question
vec(std::istream_iterator<std::string>(iss),
std::istream_iterator<std::string>());
std::copy(vec.begin(), vec.end(),
std::ostream_iterator<std::string>(std::cout, "\n"));
}
编译器在调用std::copy时抛出错误
request for member 'begin' in 'vec', which is of non-class type...
我可以像这样绕过错误:
std::istream_iterator<std::string> it_begin(iss);
std::istream_iterator<std::string> it_end;
std::vector<std::string> vec(it_begin, it_end);
或者通过在每个参数周围加上括号,像这样:
std::vector<std::string>
vec((std::istream_iterator<std::string>(iss)),
(std::istream_iterator<std::string>()));
甚至在 C++11 中使用新的统一初始化:
std::vector<std::string> vec { /*begin*/, /*end*/ };
为什么编译器将示例中的声明解析为函数声明?我知道大多数令人烦恼的解析,但我认为这只发生在空参数列表中。 我也想知道为什么第二种解决方法有效。
【问题讨论】:
-
GCC 4.6.1,如果重要的话。我还尝试了 Comeau 的在线编译器。
-
节省一些打字时间:
std::istream_iterator<std::string> it_begin(iss), it_end; std::vector<std::string> vec(it_begin, it_end); -
格式良好、结构良好且格式正确的问题,切题且有用。好工作。 :)
-
Most vexing parse(C++) 的可能重复项
标签: c++ parsing stdvector most-vexing-parse