std :: getline不接受std :: back_insert_iterator

Sim*_*n1X 3 c++ stl

int main() { 
    std::deque<std::string> mydeque;
    std::back_insert_iterator<decltype(mydeque)> myback_insert_iterator(mydeque);
    std::ifstream myifstream("test.txt");
    while(std::getline(myifstream, *myback_insert_iterator)) {
    }
}
Run Code Online (Sandbox Code Playgroud)

我只想将文本文件逐行读入字符串容器.这会产生编译错误:

C2784:无法从'std :: ifstream'推断'std :: basic_istream <_Elem,_Traits>&'的模板参数

怎么了?

Mar*_*ork 6

尝试:

int main()
{
    std::deque<std::string> mydeque;
    std::ifstream myifstream("test.txt");

    std::string line;
    while(std::getline(myifstream, line)
    {
        mydeque.push_back(line);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果每行一个单词,您可以简化为:

int main()
{
    std::deque<std::string> mydeque;
    std::ifstream myifstream("test.txt");

    // Note: istream_iterator<T> uses std::istream& operator>>(std::istream&, T&) to
    //       read data from the stream. If `T` is a std::string this means it will
    //       read a single space separated word.

    std::copy(std::istream_iterator<std::string>(myifstream),
              std::istream_iterator<std::string>(),
              std::back_inserter(mydeque)
             );
}
Run Code Online (Sandbox Code Playgroud)

如果每行包含多个单词并且您想使用后插入器,那么您需要定义一个类来读取可以与迭代器一起使用的对象中的整行:

struct Line
{
    std::string data;
    operator std::string const&() const {return data;}

    friend std::istream& operator>>(std::istream& s, Line& dst)
    {
        return std::getline(s, dst.data);
    }
};

int main()
{
    std::deque<std::string> mydeque;
    std::ifstream myifstream("test.txt");

    std::copy(std::istream_iterator<Line>(myifstream),
              std::istream_iterator<Line>(),
              std::back_inserter(mydeque)
             );
}
Run Code Online (Sandbox Code Playgroud)

或者我们可以使用构造函数:

int main()
{
    std::ifstream myifstream("test.txt");
    std::deque<std::string> mydeque(std::istream_iterator<Line>(myifstream),
                                    (std::istream_iterator<Line>()));
    // Note: Extra brace required around second iterator here
    //       This is to avoid the problem with the `Most Vexing Parse`
    //       Which would otherwise make this a function declaration

}
Run Code Online (Sandbox Code Playgroud)