相关疑难解决方法(0)

具有两个参数的向量构造函数被解析为函数声明

考虑这个例子:

#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"));
}
Run Code Online (Sandbox Code Playgroud)

编译器在调用时抛出错误 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);
Run Code Online (Sandbox Code Playgroud)

或者在每个参数周围加上括号,如下所示:

std::vector<std::string>
vec((std::istream_iterator<std::string>(iss)),
    (std::istream_iterator<std::string>()));
Run Code Online (Sandbox Code Playgroud)

甚至在C++ 11中使用新的统一初始化:

std::vector<std::string> vec { /*begin*/, /*end*/ };
Run Code Online (Sandbox Code Playgroud)

为什么编译器将示例中的声明解析为函数声明?我知道最烦恼的解析,但我认为只有空参数列表才会发生.我也想知道为什么第二种解决方法有效.

c++ parsing stdvector most-vexing-parse

5
推荐指数
1
解决办法
2394
查看次数

标签 统计

c++ ×1

most-vexing-parse ×1

parsing ×1

stdvector ×1