C ++ std :: ifstream в задаче конструктора - PullRequest
4 голосов
/ 03 октября 2010

У меня проблема с этим кодом:

#include <fstream>

struct A
{   
    A(std::ifstream input)
    {
        //some actions
    }
};

int main()
{
    std::ifstream input("somefile.xxx");

    while (input.good())
    {
        A(input);
    }

    return 0;
}

G ++ выводит мне это:

$ g++ file.cpp
file.cpp: In function `int main()':
file.cpp:17: error: no matching function for call to `A::A()'
file.cpp:4: note: candidates are: A::A(const A&)
file.cpp:6: note:                 A::A(std::ifstream)

После изменения этого он компилируется (но это не решаетпроблема):

#include <fstream>

struct A
{   
    A(int a)
    {
        //some actions
    }
};

int main()
{
    std::ifstream input("dane.dat");

    while (input.good())
    {
        A(5);
    }

    return 0;
}

Может кто-нибудь объяснить мне, что не так и как это исправить?Благодаря.

Ответы [ 3 ]

8 голосов
/ 03 октября 2010

Две ошибки:

  • ifstream не копируется (измените параметр конструктора на ссылку).
  • A(input); эквивалентно A input;.Таким образом, компилятор пытается вызвать конструктор по умолчанию.Оберните вокруг него паренсы (A(input));.Или просто дайте ему имя A a(input);.

Кроме того, что не так с использованием функции для этого?Кажется, используется только конструктор класса, который вы, похоже, используете как функцию, возвращающую void.

4 голосов
/ 03 октября 2010

ifstream не имеет конструктора копирования.A(std::ifstream input) означает «конструктор для A, принимающий ifstream значением ».Это требует, чтобы компилятор сделал копию потока для передачи конструктору, чего он не может сделать, потому что такой операции не существует.

Вам необходимо передать поток по ссылке (что означает «использовать то же самое»).объект потока, а не его копия. ") Поэтому измените сигнатуру конструктора на A(std::ifstream& input).Обратите внимание на амперсанд, что означает «ссылка», а в случае параметров функции означает «передать этот параметр по ссылке вместо по значению .


Стилистическое примечание: Тело вашего цикла while, A(input);, создает структуру типа A, которая затем почти сразу же разрушается при цикле while. Вы уверены, что этоэто то, что вы хотите сделать? Если этот код завершен, то более разумно было бы сделать это функцией или функцией-членом A, которая построена вне цикла:

static void process(std::istream& stream)
{
    // some actions
    // note stream is declared as std::istream&; this lets you pass
    // streams that are *not* file-based, if you need to
}

int main()
{
    std::ifstream input("somefile.xxx");

    while (input.good())
    {
        process(input);
    }

    return 0;
}

ИЛИ

struct A
{   
    A()
    {
        // default constructor for struct A
    }

    void process(std::istream& stream)
    {
        // some actions
    }
};

int main()
{
    std::ifstream input("somefile.xxx");

    A something;
    while (input.good())
    {
        something.process(input);
    }

    return 0;
}
2 голосов
/ 03 октября 2010

Потоки не копируются.

Так что вам нужно пройти по ссылке.

struct A
{   
    A(std::ifstream& input)
                 ^^^^^
    {
        //some actions
    }
};
...