2017-06-09 2 views
0
#include <bits/stdc++.h> 
using namespace std; 
class A { 
    int x; 
public: 
    class B { 
    public: 
     int y; 
     B(int _y) : y(_y) {} 
     explicit operator A() const { 
      return A(y); 
     } 
    }; 
    explicit A (int _x) : x(_x) {} 
    explicit A (const A& o) : x(o.x) {} 
}; 
typedef unsigned int size_type; 
int main() { 
    return 0; 
} 

Error: g++ -Wall -I./ -I/home/abdelrahman/main-repo/ -o "testt" "testt.cpp" (in directory: /home/abdelrahman/Desktop)explicite C++ mot-clé: quel est le problème avec ce code?

testt.cpp: In member function ‘A::B::operator A() const’: testt.cpp:11:14: error: no matching function for call to ‘A::A(A)’ return A(y); ^

Compilation failed.

+0

Déplacer le constructeur pour être avant la classe B? – NathanOliver

+0

Voir cette question par exemple, les constructeurs de copie explicites ont tendance à désavouer le retour en termes de valeur: https://stackoverflow.com/questions/4153527/explicit-copy-constructor-behavior-and-practical-uses –

+0

FYI: Si vous supprimez l'explicite À partir du constructeur de copie, il compile. Maintenant, en regardant pourquoi. –

Répondre

1

Marquant le constructeur de copie explicite signifie que le compilateur ne peut pas l'utiliser implicitement, et qui est ce qui se passe lorsque la fonction retourne - il y a une utilisation implicite du constructeur de copie lorsque la valeur de retour est copié "hors" de la fonction.

La même chose se produit lorsque vous passez un argument - le compilateur utilise implicitement le constructeur de copie pour créer l'argument.

Voici un exemple minimal qui échoue pour ces raisons:

class A 
{ 
public: 
    A(){} 
    explicit A(const A&){} 
}; 

void g(A a) 
{ 

} 

A f() 
{ 
    A a; 
    return a; // Fails; no suitable constructor 
} 

int main() 
{ 
    A a; 
    g(a); // Fails; no suitable constructor 
} 

Les copies que vous pouvez faire sont des copies explicites - celles où le code source explicitement des copies d'un objet, comme

A a; 
A b(a); // Succeeds because this is an explicit copy. 

Il est inutile d'utiliser explicit sur tout sauf les constructeurs de conversion.

+0

que voulez-vous dire par des copies implicites?! et où retourner une valeur fait-elle des conversions implicites? ne devrait-il pas simplement appeler le constructeur de la copie avec un paramètre explicite de type 'A'. Je pense aussi qu'il y a quelque chose d'autre dans votre code qui définit un autre constructeur qui supprime le constructeur par défaut donc vous ne devriez pas l'utiliser dans la ligne de retour 'A()' ou vous pouvez le définir vous-même. –