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);
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
'si constexpr (..)' en C++ 17. – Jarod42