这是头文件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()
中而不是隐藏在一个独立函数中?
答案 0 :(得分:1)
这是因为fstream有一个不匹配的成员getline,将调用更改为std :: getline它会起作用。
答案 1 :(得分:1)
这是名称查找不按预期方式工作的情况。
您的班级File
继承自fstream
继承的istream
。 istream
有a member function getline
,实际上有两个。
当您在类成员中调用非限定getline
时,编译器会找到继承的getline
成员,然后再看不到任何内容。在自由函数test()
中没有成员函数,因此编译器会查找由using namespace std;
引入的函数。
解决方案是明确使用std::getline(*this, line)
来表明您想要调用自由函数而不是成员函数。
这也可能是不执行using namespace std;
的另一个原因,而是使用std::
来引用标准库名称。