class Sample
{
public:
Sample();
Sample(int i);
Sample(Sample& s);
~Sample();
};
Sample::Sample()
{
cout<<"Default constructor called\n";
}
Sample::Sample(int i)
{
cout<<"1-argument constructor called\n";
}
Sample::Sample(Sample& s)
{
cout<<"Copy constructor called\n";
}
Sample::~Sample()
{
cout<<"Destructor called\n";
}
void Fun(Sample s)
{
}
int main()
{
Sample s1;
Fun(5);
return 0;
}
Je prévu une conversion implicite de 5. Mais, quand je compilez le code ci-dessus, je suis l'erreur suivante:Erreur dans la conversion automatique
main.cpp:7:8: error: no matching function for call to ‘Sample::Sample(Sample)’
main.cpp:7:8: note: candidates are:
Sample.h:10:3: note: Sample::Sample(Sample&)
Sample.h:10:3: note: no known conversion for argument 1 from ‘Sample’ to ‘Sample&’
Sample.h:9:3: note: Sample::Sample(int)
Sample.h:9:3: note: no known conversion for argument 1 from ‘Sample’ to ‘int’
Sample.h:8:3: note: Sample::Sample()
Sample.h:8:3: note: candidate expects 0 arguments, 1 provided
Helper.h:6:13: error: initializing argument 1 of ‘void Fun(Sample)’
Quel est le problème? Lorsque je supprime le constructeur de copie, le code ci-dessus compile avec succès.
Merci d'avance.
pourquoi "Fun (5);" invoque "Sample :: Sample (int i)"? comment le travail de conversion dans un tel cas? – URL87
@ URL87 Il existe un seul constructeur d'argument qui devrait être appelé s'il n'est pas marqué explicitement. Mais quel rôle joue le constructeur ici et ne laisse pas le code compiler, c'est ma confusion. – abhithakur88