2017-08-07 143 views
1
template<typename T> class SomeClass{ 

public: 
    enum SomeEnum{ SOME_FLAG}; 

}; 

SomeClass::SomeEnum some_enum =  SomeClass::SomeEnum::SOME_FLAG;  //NO 
SomeClass<int>::SomeEnum some_enum = SomeClass::SomeEnum::SOME_FLAG;  //NO 
SomeClass<int>::SomeEnum some_enum = SomeClass<int>::SomeEnum::SOME_FLAG; //YES 

這不能編譯,因爲C++ - 從模板類使用枚舉沒有模板參數

類SomeClass的無模板參數使用

有沒有辦法/解決方法,使用它沒有模板參數,有點讓那個枚舉全局,所以它不依賴於參數。

這並不是說我不能輸入它們,但它們可能很長很複雜,代碼會很難閱讀,我不能在這裏使用類似auto的東西。 (我是新來的模板很抱歉,如果這個問題是瘸子。)

+0

爲什麼你就不能定義類(模板)外枚舉?在命名空間範圍內。 (我希望你的項目有一個命名空間......) – Brian

+0

@Brian簡單地在類的外面定義它們意味着它們可以與項目中的其他枚舉名稱衝突。 (除非我將它定義爲「enum SomeClass_SomeEnum {...}」,但我想要比這更優雅的東西。) – AdyAdy

+0

@AdyAdy如果問題是名稱衝突,則可以使用範圍枚舉。 – skypjack

回答

3

如果你想附上枚舉類定義爲原因(我不能說什麼是真正的問題),你仍然可以引入一個不是類模板幷包含枚舉的類,然後使用類模板繼承該類。就這樣。
作爲一個例子:

struct SomeBase { 
    enum SomeEnum { SOME_FLAG }; 
}; 

template<typename> 
struct SomeClass: SomeBase { 
    // ... 
}; 

使用此:

SomeBase::SomeEnum::SOME_FLAG; 

取而代之的是:每當你想直接訪問枚舉

SomeClass::SomeEnum::SOME_FLAG; 


像下面仍然有效呢:

SomeClass<void>::SomeEnum foo = SomeClass<void>::SomeEnum::SOME_FLAG;