2017-10-12 2 views
0

J'ai reçu deux classes de modèles CarOwner et Truck.Utilisation de C++ enum à partir d'une classe de modèle différente en tant que paramètre de fonction

// CarOwner.h 
#include "Truck.h" 
template<size_t T1, typename T2> 
class CarOwner { 
public: 
    enum MyEnum { 
     red = 0, 
     green 
    } 

    void DoSomething(); 

private: 
    Truck<DataContainer<T1,T2>> truck_; 
    MyEnum color; 
} 

// CarOwner.hpp 
template<size_t T1, typename T2> 
void CarOwner<T1,T2>::DoSomething(){ 
    this->truck_.setEnum(this->color); 
} 

// Truck.h 
template<typename G> 
class Truck { 
    void setEnum(CarOwner<T1,T2>::MyEnum color); // <--- 
} 

Mon problème est de comprendre comment écrire la déclaration de fonction de void setEnum();. Comme indiqué dans le code ci-dessus, je veux réellement passer la fonction une énumération de type CarOwner<T1,T2>::MyEnum color. Comme j'ai besoin de #include "Truck.h" dans la classe CarOwner, je ne peux pas inclure le CarOwner dans la classe Truck. En outre, les paramètres de modèle T1 et T2 sont inconnus à l'intérieur de la classe Truck car il a un type de modèle différent G.

Je n'ai aucune idée comment déclarer correctement cette fonction pour accepter le CarOwner<T1,T2>::MyEnum. Toute aide est appréciée!

Edit: paramètre de modèle G est une combinaison de T1 et T2.

Ce code est juste un exemple pour énoncer mon problème et la conception est évidemment étrange.

+0

Cela semble être un design étrange. Pourquoi le propriétaire de la voiture * aurait-il une couleur? –

+0

'DoSomething' doit d'abord être déclaré dans le corps de' CarOwner'. 'Truck truck_;' ne fonctionnera pas car 'Truck' est un template, donc vous devrez passer' G' comme paramètre de template 'CarOwner'. 'setEnum' doit également être un modèle. – VTT

+0

Merci pour les conseils. Je veux vraiment éviter d'ajouter un paramètre de template supplémentaire à 'CarOwner'. Ne serait-il pas possible de déclarer en quelque sorte le 'CarOwner' dans' Truck'? – DummySenior

Répondre

0

Truck est instancié en supposant que Truck<DataContainer<T1,T2>>, vous pouvez écrire une spécialisation partielle:

template<typename G> 
class Truck { 
    // whatever 
}; 

template<typename T1,typename T2> 
class CarOwner; 

template<typename T1, typename T2> 
class Truck<DataContainer<T1,T2>> { 
    void setEnum(typename CarOwner<T1,T2>::MyEnum color); 
}; 

Sinon, vous pouvez créer des modèles à setEnum sur, disons, OwnerType:

template<typename G> 
class Truck { 
    template<typename OwnerType> 
    void setEnum(typename OwnerType::MyEnum color); 
}; 

// ... 

void CarOwner<T1,T2>::DoSomething(){ 
    this->truck_.template setEnum<CarOwner<T1,T2>>(this->color); 
} 

ou ...

+0

Je ne savais même pas que vous pourriez modéliser setEnum! Merci beaucoup, ça fonctionne comme un charme! – DummySenior