2012-08-26 2 views
4
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.

+1

pourquoi "Fun (5);" invoque "Sample :: Sample (int i)"? comment le travail de conversion dans un tel cas? – URL87

+0

@ 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

Répondre

6

Les temporaires ne peuvent pas être liés à des références non const. Votre constructeur de copie doit être:

Sample::Sample(const Sample&) 

L'enlever indique au compilateur de générer un trivial, qui aura la signature ci-dessus.

+0

Si je supprime le constructeur de copie, il appelle 1 constructeur d'arg pour la conversion implicite d'int 5 en objet d'échantillon en utilisant 1-arg constructeur. Mais quand j'ajoute le constructeur de copie ci-dessus, il commence à signaler l'erreur. Pourquoi il commence à confondre avec le constructeur de la copie quand sa conversion peut simplement être faite en utilisant le constructeur 1-arg comme avant d'ajouter le constructeur de copie ci-dessus. – abhithakur88

+0

Le code que vous avez fourni ne fait rien ... –

+0

@ abhithakur88 cela signifie que vous devez donner plus de contexte - comment vous appelez la fonction, etc. –

Questions connexes