我正在尝试编写一个带有ifstream&
参数的函数。
void word_transform(ifstream & infile)
{
infile("content.txt");
//etc
}
这给了我一个错误:
类型"ifstream"(又名"basic_ifstream")不提供呼叫运算符。
你能请我怎么了吗?
调用运算符是一个类似于operator()( params )
允许使用语法myObject( params )
的函数。
所以,当你写infile(...)
,你是在试图给我们一个呼叫接线员。
您要做的是打开一个文件,使用 open
方法:
void word_transform(ifstream & infile)
{
infile.open("content.txt",std::ios_base::in);
if ( infile.is_open() )
infile << "hello";
infile.close();
}
但是,正如评论的那样,将文件引用传递给这样的函数并没有真正的意义。您可以考虑:
void word_transform(istream& infile)
{
infile << "hello";
}
int main()
{
ifstream infile;
infile.open("content.txt",std::ios_base::in);
if ( infile.is_open() )
word_transform( infile );
infile.close();
return 0;
}
或:
void word_transform()
{
ifstream infile;
infile.open("content.txt",std::ios_base::in);
if ( infile.is_open() )
infile << "hello";
infile.close();
}
int main()
{
word_transform();
return 0;
}
您尝试对参数调用operator()
。那行不通。您正在尝试打开文件吗?如果获取ifstream
作为参数,则应从一开始就打开它,因为您在函数外部打开了它。传递流然后在函数中打开它是没有意义的。
void word_transform(std::ifstream& infile)
{
// read something from infile
}
int main()
{
std::ifstream file("content.txt");
// error checks
word_transform(file);
return 0;
}
infile("content.txt");
请注意,这将尝试在已经创建的 infile 类型的对象上调用 operator()。由于 ifstream 中不存在这样的运算符,因此您遇到了错误。
相反,你应该这样做:-
infile.open("content.txt");
据我了解,调用运算符是 operator()
,这显然不是为ifstream
定义的。你必须对word_transform
的论点做一些不同的事情.
通常,(引用)流被传递给 I/O 的函数。这意味着该函数应该采取 std::istream
或std::ostream
论点,但不是std::ifstream
或std::ofstream
.这样你的函数就可以与任何派生自std::istream
的流对象一起使用,包括std::cin
、std::istrstream
和std::ifstream
。
正如 nvoigt 所说,将std::ifstream
传递给函数进行打开是没有意义的。调用方绝对不清楚其流是否可能被关闭并打开到另一个文件。