2017-08-07 88 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;