C++ std::ifstream dans le constructeur problème
J'ai un problème avec ce code:
#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++ sorties me présente:
$ 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)
Après modification, il compiler (mais ce n'est pas résoudre le problème):
#include <fstream>
struct A
{
A(int a)
{
//some actions
}
};
int main()
{
std::ifstream input("dane.dat");
while (input.good())
{
A(5);
}
return 0;
}
Quelqu'un peut-il m'expliquer quel est le problème et comment le résoudre? Merci.
OriginalL'auteur darvan | 2010-10-02
Vous devez vous connecter pour publier un commentaire.
Deux bugs:
ifstream
n'est pas copiable (modifier le paramètre dans le constructeur de référence).A(input);
est équivalent àA input;
. Ainsi, le compilateur essaie d'appeler le constructeur par défaut. Envelopper les parenthèses autour d'elle(A(input));
. Ou tout simplement lui donner un nomA a(input);
.Aussi, quel est le problème avec l'aide d'une fonction pour ça? Seul le constructeur de la classe est utilisé, il me semble, qui vous semblent les abus comme une fonction retournant
void
.Les parenthèses autour de
input
sont la liaison entre parenthèses utilisées dans declarators, par exemple tels qu'ils apparaissent dansvoid (*p)();
autour de*p
. Ceux autour deinput
sont redondantes. C'est ce que les gens de temps en temps de l'expérience dansvector<int> p(istream_iterator<int>(cin), ...);
, où redondants entre parenthèses sont spécifiés autour decin
.J'ai oublié de mentionner que j'ai essayé cette chose avec des références. (Un(entrée)) était un bug, merci.
OriginalL'auteur Johannes Schaub - litb
ifstream
ne possède pas de constructeur de copie.A(std::ifstream input)
signifie "constructeur deA
prendre unifstream
en valeur." Qui exige que le compilateur de faire une copie du flux à passer au constructeur, il ne peut pas le faire parce qu'aucune opération de ce type n'existe.Vous avez besoin pour passer le flux de référence (ce qui signifie "utiliser le même objet de flux de données, et non pas une copie de celui-ci.") Afin de changer la signature du constructeur de
A(std::ifstream& input)
. Note de l'esperluette, qui signifie "de référence" et, dans le cas de paramètres de la fonction, signifie "passer ce paramètre par référence plutôt que en valeur.Stylistique remarque: Le corps de votre
while
boucle,A(input);
, construit une structure de typeA
, qui est alors presque immédiatement détruit lors de lawhile
boucle boucles. Êtes-vous sûr que c'est ce que vous voulez faire? Si ce code est complet, alors il serait plus judicieux d'en faire une fonction, ou une fonction de membre deA
qui est construit à l'extérieur la boucle:OU
OriginalL'auteur Jonathan Grynspan
Les flux sont non copiable.
De sorte que vous devez passer par référence.
OriginalL'auteur Martin York