2017-08-17 1 views
0

Je suis confronté à un problème avec une séquence de conversions définies par l'utilisateur en C++. Consultez le code suivant:Séquence de conversions définies par l'utilisateur en C++

struct A 
{ 
    A(int); 
}; 

struct B 
{ 
    B(A); 
}; 

struct C 
{ 
    C(B); 
}; 

Les constructeurs sont définis quelque part. Maintenant, les énoncés suivants fonctionnent très bien:

A(1);  // A <- int 

B(1);  // B <- A <- int 

C(A(1)); // C <- B <- A <- int 
C(B(1)); // C <- B <- A <- int 
C(B(A(1))); // C <- B <- A <- int 

Cependant, lorsque je tente de compiler les éléments suivants:

C(1);  // C <- B <- A <- int 

que je reçois l'erreur suivante:

error: no matching function for call to ‘C::C(int)’ 
no known conversion for argument 1 from ‘int’ to ‘B’ 

Je sais que cette une construction est illégale en C++. Néanmoins, ma question est:

  • Comment puis-je le contourner? Je suis à la recherche de solution élégante. Les constructions comme C(B(A(1))) sont quelque peu ennuyantes.

Pour être complet, j'ai trouvé plusieurs questions connexes (par exemple, Why user-defined conversions are limited?). Cependant, aucun ne répond à ma question.

+0

Dans les mots de l'homme araignée, [tout le monde obtient une seule (conversion définie par l'utilisateur)] (https://www.youtube.com/watch?v=FYZfNZbn0SU) – NathanOliver

+0

le nombre de conversions possibles serait croître de façon exponentielle avec le nombre de types impliqués si cela était autorisé – user463035818

+1

Quant à la première question, ce n'est pas tellement que les choses vont se casser, mais ce code serait beaucoup plus difficile à comprendre. Si deux conversions définies par l'utilisateur étaient autorisées, il y aurait ** beaucoup plus de ** séquences de conversion possibles, impliquant parfois des types qui ne sont pas directement visibles dans votre code. –

Répondre

0

Comme vous l'avez dit, votre première question a déjà reçu une réponse.

En ce qui concerne un travail autour, supposant que vous ne voulez pas ajouter un Un constructeur à votre classe C, vous pouvez simplement la banque sur celle permise conversion implicite:

C(B(1)); 

Ce qui suit devrait fonctionner aussi:

C(A(1)); 
+0

C'est ce que je fais maintenant. Cependant, je ne le trouve pas trop élégant. – DaBler