2017-10-19 64 views
1

Je travaille avec un autre code de personne qui utilise une fonction doSomething qui dépend de deux modèles: stage et T. Je sais qu'ils peuvent simplement prendre les états (Micro, DerivedOne) ou (Macro, DerivedTwo)Erreur de compilation dans le modèle sur la fonction de moulage non appelé

En doSomething j'ai besoin maintenant de jeter DerivedTwo-BaseTwo et DerivedOne-BaseOne. Comme on le voit dans le code, les conversions ne sont effectuées que lorsque l'étape est correcte, c'est-à-dire qu'elles sont toujours o.k. Encore je reçois des erreurs de compilation, car il n'est pas possible de lancer DerivedOne à BaseTwo même si cette distribution n'est jamais faite.

Question: Comment puis-je compiler ce code sans modifier la structure générale des classes et modèles concernés? (Ceci casserait à beaucoup d'autres parties du code). De préférence, je veux seulement changer doSomething.

La conversion se produit b.c. Je dois appeler une fonction surchargée qui peut prendre BaseOne ou BaseTwo. Par conséquent, pour passer DerivedTwo j'ai besoin de le lancer explicitement.

aTest.h

enum Stage { 
    Micro, 
    Macro 
}; 

class BaseOne 
{ 
int a; 
}; 

class BaseTwo 
{ 
int b; 
}; 


class DerivedOne : public BaseOne 
{ 
int c; 
}; 

class DerivedTwo: public BaseTwo, public BaseOne 
{ 
int d; 
}; 

template <Stage stage> 
class Doer{ 
    template <class T> 
    void doSomething(T t); 

}; 

aTest.cpp

#include "aTest.h" 

template< Stage stage > 
template < class T > 
void Doer<stage>::doSomething(T t) { 


//depending on stage we need to cast t to BaseOne or BaseTwo 
if(stage == Micro) 
{ 
    overloadedFunction((BaseOne) t); 
} 
if(stage == Macro) 
{ 
    overloadedFunction((BaseTwo) t); 
} 



} 


template class Doer<Micro>; 
template class Doer<Macro>; 


template void Doer<Micro>::doSomething(DerivedOne t); 
template void Doer<Macro>::doSomething(DerivedTwo t); 
+0

même si la distribution n'est jamais faite? D'après ce raisonnement aussi if (1 == 0) {erreur de syntaxe; } 'devrait compiler. Le code contenant la distribution est instancié, il doit donc être valide. Je ne parle pas couramment sur C++ 11 et au-delà, mais peut-être un constexpr if peut aider – user463035818

+0

'si constexpr (..)' en C++ 17. – Jarod42

Répondre

1

Vous pouvez utiliser:

if constexpr (stage == Macro) 
    overloadedFunction((BaseTwo) t); 

Maintenant, pourquoi cela va être utile?

Parce que maintenant que l'instruction if contient constexpr, il évaluera son état au moment de la compilation et établira son corps, que si la condition est évaluée à true. Cela signifie que le corps pourrait être mal formé, et pourtant le code pour être en mesure de compiler. Lire la suite here.