我想知道如何做到這一點: 說我有A類,與枚舉的內部B它模板化的枚舉類型參數
class A {
enum B {
};
};
而且我想創建一個函數,接受作爲一個模板,然後假設A有一個枚舉B類型並接收它的val作爲參數?我試過類似的東西:
template<typename T>
static void Foo(T t, T::B b) {}
但是,沒有工作..任何人有一個想法?
謝謝。
我想知道如何做到這一點: 說我有A類,與枚舉的內部B它模板化的枚舉類型參數
class A {
enum B {
};
};
而且我想創建一個函數,接受作爲一個模板,然後假設A有一個枚舉B類型並接收它的val作爲參數?我試過類似的東西:
template<typename T>
static void Foo(T t, T::B b) {}
但是,沒有工作..任何人有一個想法?
謝謝。
您需要告訴編譯器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?:
你必須使用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);
}
你必須確保'T'延伸'A'? – Obicere
不,只是假定枚舉存在 – Alon
從屬類型名稱。 – Rapptz