C ++:没有匹配函数

时间:2017-12-24 07:11:15

标签: c++ inheritance

这是头文件File.h:

#include "common.h"

#ifndef FILE_H
#define FILE_H
using namespace std;
class File : public fstream{
public:
        string file;
        File(){
                File("/tmp/text");
        }
        File(string file_name): file(file_name), fstream(file_name.c_str(), fstream::in | fstream::out){
        }
        void read_line();
};
#endif

这是File.cpp文件:

#include "File.h"

void File::read_line(){
        string line;

        while(getline(*this, line)){
                cout << "line: " << line << endl;
        }
}

以下是common.h的内容

#include <iostream>
#include <stdlib.h>
#include <vector>
#include <string.h>
#include <string>
#include <stdio.h>
#include <stack>
#include <unistd.h>
#include <cassert>
#include <stdexcept>
#include <getopt.h>
#include <fstream>
#include <istream>

编译上面的代码时,我得到以下错误:

/home/rohit/cpp/cmake_projs/tree/src/File.cpp: In member function ‘void File::read_line()’:
/home/rohit/cpp/cmake_projs/tree/src/File.cpp:7:24: error: no matching function for call to ‘File::getline(File&, std::__cxx11::string&)’
  while(getline(*f, line)){
                        ^
In file included from /usr/include/c++/7/iostream:40:0,
                 from /home/rohit/cpp/cmake_projs/tree/include/common.h:1,
                 from /home/rohit/cpp/cmake_projs/tree/include/File.h:1,
                 from /home/rohit/cpp/cmake_projs/tree/src/File.cpp:1:

但是当我将几乎相同的代码放在与File类无关的不同函数中时,代码编译得很好:

void test(){
        string line;
        File *f = new File("/tmp/abc");

        while(getline(*f, line)){
                cout << "line: " << line << endl;
        }
}

为什么这个标准函数隐藏在类函数read_line()中而不是隐藏在一个独立函数中?

2 个答案:

答案 0 :(得分:1)

这是因为fstream有一个不匹配的成员getline,将调用更改为std :: getline它会起作用。

答案 1 :(得分:1)

这是名称查找不按预期方式工作的情况。

您的班级File继承自fstream继承的istreamistreama member function getline,实际上有两个。

当您在类成员中调用非限定getline时,编译器会找到继承的getline成员,然后再看不到任何内容。在自由函数test()中没有成员函数,因此编译器会查找由using namespace std;引入的函数。

解决方案是明确使用std::getline(*this, line)来表明您想要调用自由函数而不是成员函数。

这也可能是不执行using namespace std;的另一个原因,而是使用std::来引用标准库名称。