6

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?

Chnossos
  • 9,971
  • 4
  • 28
  • 40
Newbie
  • 341
  • 1
  • 7
  • 17

5 Answers5

8

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;
}
jpo38
  • 20,821
  • 10
  • 70
  • 151
  • 1
    Your last comment is very pertinent: if he is going to open and close the file in the function, the `std::ifstream` should be local to the function; it serves no purpose to have it as an argument. A more frequent idiom, however, would be to have it opened and closed by the caller, and to pass a `std::istream&` argument (rather than an `std::ifstream&`). – James Kanze Dec 16 '14 at 10:44
3

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;
}
nvoigt
  • 75,013
  • 26
  • 93
  • 142
1
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");
ravi
  • 10,994
  • 1
  • 18
  • 36
0

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.

Codor
  • 17,447
  • 9
  • 29
  • 56
0

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.

Walter
  • 44,150
  • 20
  • 113
  • 196