考虑这个例子:矢量构造函数有两个参数被解析为函数声明
#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的在线编译器。 – jrok
保存自己的一些输入:'std :: istream_iterator it_begin(iss),it_end; std :: vector vec(it_begin,it_end);' –
格式良好,结构良好且格式良好的问题,符合主题和有用。做得好。 :) –