C++ - 在没有模板参数的情况下使用模板类中的枚举

8
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 等工具。(我对模板还不太熟悉,如果这个问题很幼稚请见谅。)


为什么你不能在命名空间作用域(我希望你的项目有一个命名空间...)之外定义枚举(模板)? - Brian Bi
2
@Brian 简单地在类外定义它们意味着它们可能与项目中的其他枚举名称冲突。(除非我将其定义为“enum SomeClass_SomeEnum{...}”,但我想要更优雅的东西。) - AdyAdy
1
@AdyAdy 如果您的问题是名称冲突,可以使用作用域枚举。 - skypjack
2个回答

10
如果你想将枚举类型放在类定义中(出于某些原因,我不知道真正的问题),你仍然可以引入一个不是类模板的类来包含枚举,然后使用该类模板继承它。就这样。
以下是一个示例:
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;

0
using MySomeClass = SomeClass<int>;

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

1
仅提供代码的答案被认为是低质量的:请确保提供解释您的代码是如何解决问题的。如果您在帖子中添加更多信息,将有助于提问者和未来的读者。另请参阅解释完全基于代码的答案:https://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers - borchvm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接