2017-04-21 2 views
0

Disons que j'ai le code suivant:La conversion de ce implicitement à l'aide d'un opérateur de conversion défini par l'utilisateur

class Base 
{ 
}; 

class Foo 
{ 
public: 
    Foo(Base* base) 
    { 
    } 
}; 

class BarBase 
{ 
public: 
    operator Base*() 
    { 
     return base; 
    } 

private: 
    Base* base; 
}; 

class Bar : public BarBase 
{ 
public: 
    Bar() 
    { 
     Foo* foo = new Foo(this); 
    } 
}; 

Le code ne peut pas compiler avec l'erreur suivante sur GCC 6.3:

prog.cpp: In constructor ‘Bar::Bar()’: 
prog.cpp:30:26: error: no matching function for call to ‘Foo::Foo(Bar*)’ 
    Foo* foo = new Foo(this); 
         ^

BarBase que Bar dérive de a un opérateur de conversion défini par l'utilisateur pour Base*. Pourquoi this n'obtient implicitement converti en Base* en utilisant l'opérateur de conversion susmentionné?

+0

@Piotr Skotnicki Pourquoi avez-vous supprimé l'étiquette C++ 14? La question était pour C++ 14, qui est actuellement la dernière norme que le compilateur que j'utilise supporte. – tambre

+1

Parce que le problème ici n'a rien à voir avec les fonctionnalités C++ 14. – songyuanyao

+0

@songyuanyao Dans ce cas, je voulais savoir pourquoi il en est ainsi dans la révision standard C++ 14, qui est la version standard que je développe pour). Il peut être légèrement différent dans C++ 03 ou une autre révision standard C++. Toujours bon d'être explicite. – tambre

Répondre

4

Vous avez correctement défini l'opérateur de conversion implicite, mais il ne s'applique pas à un pointeur vers votre objet, mais seulement à une référence. Changer votre code pour

Foo* foo = new Foo(*this); 

Il est impossible de définir un opérateur de conversion implicite pour un type de pointeur parce que les opérateurs de conversion doivent être des fonctions membres non statiques et appliquent donc uniquement aux références.