Pregunta

Tengo un problema con este código:

#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 ++ me salidas esto:

$ 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)

Después de cambiar a esto se compile (pero que no es la solución del problema):

#include <fstream>

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

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

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

    return 0;
}

Puede alguien explicar lo que está mal y cómo solucionarlo? Gracias.

¿Fue útil?

Solución

Dos errores:

  • ifstream es no copiable (cambiar el parámetro constructor a una referencia).
  • A(input); es equivalente a A input;. De este modo el compilador intenta llamar al constructor por defecto. Parens envoltura alrededor de ella (A(input));. O simplemente darle un nombre A a(input);.

Además, ¿qué hay de malo con el uso de una función para esto? Sólo el constructor de la clase se utiliza lo que parece, que pareces al abuso, como función que devuelve void.

Otros consejos

ifstream no tiene un constructor de copia. medios A(std::ifstream input) "constructor de A tomar un ifstream por valor ". Eso requiere el compilador para hacer una copia de la corriente para pasar al constructor, que no puede hacerlo porque no existe tal operación.

Tiene que pasar la corriente por referencia (es decir, "utilizar el mismo objeto de secuencia, no una copia de la misma.") Así que cambie la firma constructora para A(std::ifstream& input). Tenga en cuenta el signo, que significa "de referencia" y, en el caso de los parámetros de función, "pasan medios este parámetro por referencia en lugar de por valor .


nota estilístico: El cuerpo de su bucle while, A(input);, construye una estructura de tipo A, que es entonces casi inmediatamente destruido cuando los bucles de bucle while. ¿Estás seguro de que esto es lo que quiere hacer? Si el código es completa, entonces tendría más sentido para hacer de esto una función o una función miembro de A que se construye fuera el bucle:

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;
}

o

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;
}

Streams son no copiable.

Así que hay que pasar por referencia.

struct A
{   
    A(std::ifstream& input)
                 ^^^^^
    {
        //some actions
    }
};
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top