Reputation: 361
I'm trying to write a function with an ifstream&
argument.
void word_transform(ifstream & infile)
{
infile("content.txt");
//etc
}
which gave me an error:
Type 'ifstream' (aka 'basic_ifstream ') does not provide a call operator.
Can you please me what's wrong?
Upvotes: 6
Views: 55990
Reputation: 21584
call operator is a function like operator()( params )
allowing to use the syntax myObject( params )
.
So, when you write infile(...)
, you are trying to us a call operator.
What you are trying to do is to open a file, use the open
method:
void word_transform(ifstream & infile)
{
infile.open("content.txt",std::ios_base::in);
if ( infile.is_open() )
infile << "hello";
infile.close();
}
But, as commented, it does not really make sense to pass infile reference to such a function. You may consider:
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;
}
Or:
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;
}
Upvotes: 8
Reputation: 45484
Typically, (references to) streams are passed to functions for I/O. This means the function should take
std::istream
or std::ostream
argument, but not std::ifstream
or std::ofstream
. This way your function can be used with any stream object derived from std::istream
, including std::cin
, std::istrstream
, and std::ifstream
.
As nvoigt said, passing an std::ifstream
to a function for opening makes little sense. It is definitely not clear to the caller that its stream may be closed and opened to another file.
Upvotes: 0
Reputation: 10733
infile("content.txt");
Note that this would try to call operator() on already created object of type infile. As no such operator exists from ifstream , you got an error.
Rather you should do:-
infile.open("content.txt");
Upvotes: 1
Reputation: 17605
To my understanding, the call operator is operator()
, which apparently is not defined for ifstream
. You have to do something different with the argument of word_transform
.
Upvotes: 0
Reputation: 77364
You attempt to call operator()
on your parameter. That will not work. Are you trying to open a file? If you get an ifstream
as parameter, it should be open from the start because you opened it outside your function. Passing a stream and then opening it inside your function does not make sense.
void word_transform(std::ifstream& infile)
{
// read something from infile
}
int main()
{
std::ifstream file("content.txt");
// error checks
word_transform(file);
return 0;
}
Upvotes: 3