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

如何使用enum Type作爲類模板?我想用它作爲Socket::Type::UDP等 我試着在Socket之前聲明enum class Socket::Type,但它不起作用。C++使用內部枚舉類模板

+1

你會如何使用它? 'Socket :: Type :: TCP>' – chris

+0

我想用它作爲'Socket :: Type :: TCP' –

+1

這是不可能的。在您提供參數之前,模板只是一個模板。 – Galik

回答

3

每個Socket<...>有一個不同的Type枚舉。除了單獨的枚舉類型之外,使用Socket::Type不可能的一個原因是Socket的專門化甚至不能包含枚舉,也不能使用枚舉之外的其他東西。

你有兩個主要選擇:

  1. 使用密切命名爲一個單獨的類/命名空間:

    class Sockets { 
    public: 
        enum class Type { ... }; 
    }; 
    
    template<Sockets::Type T> 
    class Socket { ... }; 
    
    Socket<Sockets::Type::TCP> s; 
    
  2. 使用一個單獨的枚舉類型:

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

或者,不要模板Socket。你一定會得到一堆if (T == TCP) { ... } else { ... }。清理分離公共部分併爲TCP和UDP使用兩種不同的實現可能會更好。