2017-10-14 4 views
2
template <Type T> 
class Socket { 
public: 
    enum class Type { 
     TCP, 
     UDP 
    }; 
    ... 
} 

Comment utiliser l'enum Type pour le modèle de classe? Je veux l'utiliser comme Socket::Type::UDP et etc. J'essaie de déclarer enum class Socket::Type avant Socket mais cela ne fonctionne pas.C++ utilise l'enum interne pour le modèle de classe

+1

Comment l'utilisez-vous? 'Socket :: Type :: TCP>' – chris

+0

Je veux l'utiliser comme 'Socket :: Type :: TCP' –

+1

Ce n'est pas possible. Un modèle est uniquement un modèle jusqu'à ce que vous fournissiez les paramètres. – Galik

Répondre

3

Chaque Socket<...> a un Type enum différent. Hormis les types enum séparés, une raison pour laquelle il n'est pas possible d'utiliser Socket::Type est qu'une spécialisation de Socket ne peut même pas inclure l'énumération, ou faire Type autre chose qu'une énumération.

Vous avez deux options principales:

  1. Utilisez une classe/espace de noms distinct nommé étroitement:

    class Sockets { 
    public: 
        enum class Type { ... }; 
    }; 
    
    template<Sockets::Type T> 
    class Socket { ... }; 
    
    Socket<Sockets::Type::TCP> s; 
    
  2. Utilisez un type ENUM séparé:

    enum class SocketType { ... }; 
    
    template<SocketType T> 
    class Socket { ... }; 
    
    Socket<SocketType::TCP> s; 
    

Sinon, ne pas utiliser le modèle Socket. Vous allez sûrement vous retrouver avec un tas de if (T == TCP) { ... } else { ... }. Il serait probablement préférable de séparer proprement les parties communes et d'utiliser deux implémentations différentes pour TCP et UDP.