带有两个参数的向量构造函数被解析为函数声明
Vector constructor with two parameters is parsed as a function declaration
考虑这个例子:
#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*/ };
编译器为什么要将示例中的声明解析为函数声明我知道大多数令人烦恼的解析,但我认为这只会发生在空参数列表中。我还想知道为什么第二种变通方法有效。
它仍然是最麻烦的解析。
std::vector<std::string> // return type
vec( // function name
std::istream_iterator<std::string>(iss), // param 1: an iterator called (iss), or just iss
std::istream_iterator<std::string>() // param 2: unnamed function
); // returning iterator
乔治迪说:
<tomalak> << ETYPE_DESC(vec); std::vector<std::string> vec(std::istream_iterator<std::string>(iss), std::istream_iterator<std::string>());
<geordi> lvalue function taking a istream_iterator<string, char, char_traits<char>, long> , a pointer to a nullary function returning a istream_iterator<string, char, char_traits<char>, long> , and returning a vector of strings
实际上,它的关键是,您的参数名称周围可以有括号(即iss
→(iss)
),而不会更改声明的语义。有时
如图所示,使用另一组括号来包围类型,以强制将第一个参数(以及第二个参数)解析为表达式而不是声明。
如果有帮助,也可以考虑:
void foo(int (x)) {
cout << x;
}
int main() {
foo(42);
}
输出为42
。
相关文章:
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 将派生类的构造函数声明为父类的友元
- 用初始化列表和超类构造函数声明子类构造函数的正确方式
- 如何使用构造函数声明指向用户定义对象的指针?
- 如何从构造函数声明新的私有变量?
- 根据二手构造函数声明成员
- 如何用类别的consumetrized构造函数声明使用类的比较对象设置的STL设置
- C++.奇怪的构造函数声明
- 使用ctags查找用c++中的构造函数声明的变量
- 将构造函数声明为private会显示错误.是否至少有一个公共构造函数是必需的
- 如何在C++中使用带参数的构造函数声明具有来自另一个类的类数据的对象
- 在构造函数声明中编写模板类型的参数列表是否有效?
- 在另一个类中使用自定义构造函数声明一个类
- 谷歌测试-构造函数声明错误
- 使用构造函数声明作为虚函数
- 无效地使用不完整的类型模板构造函数声明
- 将构造函数声明为显式时出现编译错误
- 它在构造函数声明中意味着什么
- 类构造函数声明了两次
- 有一种方法可以使用默认的复制构造函数声明复制构造函数非公共和?