【问题标题】:g++ insists looking to stdio.h getline instead of std::getline (string)g++ 坚持寻找 stdio.h getline 而不是 std::getline (string)
【发布时间】:2019-05-06 07:19:43
【问题描述】:

我的程序的一部分:

#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <sstream>

using namespace std;


/* Works for istringstream */
void func(const string& text) {
    istringstream ff(text);
    string s;

    getline(ff, s, '-');
}


/* Doesnt work for ifstream */
void read_input_file(const ifstream& inputFile) {
    string s;

    getline(inputFile, s, '\n');
}


int main(int argc, char * argv[]){

    ifstream inputfile;
    ofstream outputFile;

    inputfile.open(argv[1], ifstream::in);
    if (!inputfile.is_open()) 
        return -1;

    read_input_file(inputfile);

    inputfile.close();

    return 0;
}

istringstreamifstream 都是istream,但是在read_input_file 中,它会尝试将getlinestdio.h 中定义的匹配...

test.cpp:23:28: error: no matching function for call to ‘getline(const ifstream&, std::__cxx11::string&, char)’

  getline(inputFile, s, '\n');

g++ -Wall -c "test.cpp" 

test.cpp: In function ‘void read_input_file(const ifstream&)’:
test.cpp:23:28: error: no matching function for call to ‘getline(const ifstream&, std::__cxx11::string&, char)’
  getline(inputFile, s, '\n');
                            ^
In file included from /usr/include/c++/8/cstdio:42,
                 from /usr/include/c++/8/ext/string_conversions.h:43,
                 from /usr/include/c++/8/bits/basic_string.h:6400,
                 from /usr/include/c++/8/string:52,
                 from /usr/include/c++/8/bits/locale_classes.h:40,
                 from /usr/include/c++/8/bits/ios_base.h:41,
                 from /usr/include/c++/8/ios:42,
                 from /usr/include/c++/8/ostream:38,
                 from /usr/include/c++/8/iostream:39,
                 from test.cpp:1:
/usr/include/stdio.h:622:18: note: candidate: ‘__ssize_t getline(char**, size_t*, FILE*)’
 extern __ssize_t getline (char **__restrict __lineptr,
                  ^~~~~~~
/usr/include/stdio.h:622:18: note:   no known conversion for argument 1 from ‘const ifstream’ {aka ‘const std::basic_ifstream<char>’} to ‘char**’
...

任何想法为什么匹配错误的候选人,而不是std::getline

【问题讨论】:

标签: c++ std iostream ifstream getline


【解决方案1】:

您的问题是inputFileread_input_file 中是constinputFile 需要由 getline 修改,因此不存在采用 const ifstream&amp; 的重载。不幸的是,编译器通过提供帮助并向您展示其他可能的重载,并没有让您意识到这一事实。

【讨论】:

    猜你喜欢
    • 2012-11-30
    • 1970-01-01
    • 2014-04-17
    • 2013-09-10
    • 2010-09-20
    • 1970-01-01
    • 2011-10-12
    • 2020-10-21
    • 2015-05-25
    相关资源
    最近更新 更多