C++ 尝试编译包含二进制ifstream的代码时,编译会导致错误

C++ 尝试编译包含二进制ifstream的代码时,编译会导致错误,c++,ifstream,C++,Ifstream,我在通过输入文件流类(ifstream)访问二进制文件时遇到了一个问题 我的方法从以下调用函数开始: void ReadFile(vector<string>& argv, ostream& oss){ string FileName = argv.at(2) + "INPUT" ; ifstream BinFile ; OpenBinaryFile(FileName, BinFile) ; return ; } std::ifstream

我在通过输入文件流类(ifstream)访问二进制文件时遇到了一个问题

我的方法从以下调用函数开始:

void ReadFile(vector<string>& argv, ostream& oss){
   string FileName = argv.at(2) + "INPUT" ;
   ifstream BinFile ;
   OpenBinaryFile(FileName, BinFile) ;
   return ;
}
std::ifstream BinFile;
BinFile.open(filename, std::ifstream::binary | std::ifstream::in);
当我尝试使用gcc版本4.9.2编译此简单方案时,我得到以下错误:

error: no match for call to ‘(std::ifstream {aka std::basic_ifstream<char>}) (const char*, std::_Ios_Openmode)’
BinFile(FileName.c_str(),ifstream::binary | ifstream::in) ;
                                                        ^
错误:调用(std::ifstream{aka std::basic_ifstream})(const char*,std:_Ios_Openmode)时不匹配
BinFile(FileName.c_str(),ifstream::binary | ifstream::in);
^
我已经尝试将插入符号(“^”)精确地放置在编译器的位置

这是怎么回事?我很困惑


谢谢

有两种方法可以打开一条小溪

  • 施工期间,在声明中:

    std::ifstream BinFile(filename, std::ifstream::binary | std::ifstream::in);
    
  • 构造后,使用
    std::ifstream::open
    函数:

    void ReadFile(vector<string>& argv, ostream& oss){
       string FileName = argv.at(2) + "INPUT" ;
       ifstream BinFile ;
       OpenBinaryFile(FileName, BinFile) ;
       return ;
    }
    
    std::ifstream BinFile;
    BinFile.open(filename, std::ifstream::binary | std::ifstream::in);
    

  • 在你的问题中,你试图将两者混为一谈。这导致试图调用对象
    BinFile

    上不存在的“函数调用运算符”
    operator()
    ,如前所述,您正在使用已在调用例程堆栈上构造的对象调用构造函数。请参阅

    BinFile.open(FileName.c_str(),ifstream::binary | ifstream::in)中记录的构造函数这很有效,但现在我更困惑了。我问这个问题的原因是因为我以前打开它时没有“open”后缀<代码>ifstream BinFile(filename2,ios::in | ios::binary)在我的代码中的其他地方起作用。@EmilioW:这是一个声明。你问题中的代码不是声明。不,他没有调用构造函数。最接近的方法是使用类型名,例如,
    std::ifstream(filename,std::ifstream::binary | std::ifstream::in)
    ,它是有效的,但仍然没有调用构造函数(无论如何也不是直接调用)。他不是有意的,但签名几乎匹配。不,仍然与构造函数无关。这是
    操作符()
    他不小心试图呼叫。@Lightness,我想了解更多有关这方面的信息。我认为,当编译器引用任何运算符方法时,错误消息将包括文本
    运算符
    ,作为该方法名称的一部分,就像普通运算符声明以及符号表一样。但我没有在OP的错误信息中看到这一点。你比我走得远,所以请澄清。这是我能想到的唯一一个不这样做的操作员的例子;)您仍然可以从它所表达的表达式中看出,如果您对C++和GCC的错误消息足够熟悉。我不确定我能不能用这种格式向你解释/说服你。很好,它没有意识到语法上的细微差别。我会把这个问题作为一个资源,提供给任何遇到类似问题的人。@Emilio:是的,这似乎是一个相当合理的问题。正是出于这一目的,才有了这样的存在:为许多需要帮助的人保留问题,而不仅仅是最初的提问者。:)