C ++ - 使用模板类中的枚举而不使用模板参数

时间:2017-08-07 06:52:02

标签: c++ templates

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

这不会编译,因为

  

类SomeClass在没有模板参数的情况下使用

如果没有模板参数,没有办法/解决方法使用它,有点为该类创建枚举全局,因此它不依赖于参数。

并不是我不能输入它们但是它们可能很长而且很复杂,代码将难以阅读而且我不能在这里使用像auto这样的东西。 (我是模板的新手,如果这个问题很蹩脚,那就很抱歉。)

2 个答案:

答案 0 :(得分:5)

如果你想将你的枚举包含在原因的类定义中(我不能说出真正的问题是什么),你仍然可以再引入一个不是的类。类模板并包含枚举,然后从您的类模板继承。这就是全部。
举个例子:

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;

答案 1 :(得分:0)

using MySomeClass = SomeClass<int>;

MySomeClass::SomeEnum foo = MySomeClass::SomeEnum::SOME_FLAG;