2013-08-12 43 views
3

我想知道如何做到這一點: 說我有A類,與枚舉的內部B它模板化的枚舉類型參數

class A { 

enum B { 

}; 

}; 

而且我想創建一個函數,接受作爲一個模板,然後假設A有一個枚舉B類型並接收它的val作爲參數?我試過類似的東西:

template<typename T> 
static void Foo(T t, T::B b) {} 

但是,沒有工作..任何人有一個想法?

謝謝。

+0

你必須確保'T'延伸'A'? – Obicere

+0

不,只是假定枚舉存在 – Alon

+0

從屬類型名稱。 – Rapptz

回答

7

您需要告訴編譯器T::B是一種類型,因爲它是一個從屬名稱,並且默認情況下被假定爲非類型。

template<typename T> 
static void Foo(T t, typename T::B b) {} 
//     ^^^^^^^^ 

您還應該使枚舉公開。此代碼示例工程:

class A { 
public: 
    enum B {x, y, z}; 
}; 

template<typename T> 
static void Foo(T t, typename T::B b) {} 

int main() 
{ 
    Foo(A(), A::x); // OK 
} 

對於深入說明,請參閱Where and why do I have to put the 「template」 and 「typename」 keywords?

4

你必須使用typename關鍵字,使其工作:

static void Foo(T t, typename T::B b) {} 
         ^

enum B必須是公共。

typename關鍵字它用於指定模板定義或聲明中的從屬名稱是類型。它是模板參數中class的同義詞。

C++標準狀態:

在模板聲明或定義中使用的名稱,這是 依賴於模板的參數被假定不命名類型除非 適用的名稱查找找到的類型名或者通過關鍵字typename命名爲 。

所以除非你明確聲明typename T::B b,編譯器會假設T::B b是值類型不是類型名稱。

總結:

class A { 
public: 
    enum B {enum1, enum2}; 
}; 

template<typename T> 
static void Foo(T t, typename T::B b) {} 

int main() 
{ 
    A a; 
    Foo(a, a::enum1); 
} 

typename