2017-08-07 12 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++ - テンプレートパラメータ</p> </blockquote> <p>なしで使用</p> <blockquote> <p>クラス工assはなくて、それを使用する方法/回避策はありませんので、テンプレートパラメータなしのテンプレートクラスから使用列挙

私はそれらを入力することはできませんが、長くて複雑な場合があります。コードは読みにくく、ここではautoのようなものは使用できません。 (この質問はラメであれば、私はとても残念テンプレートに新たなんだ。)

+0

なぜあなただ​​けのクラス(テンプレート)外の列挙型を定義することはできませんか?名前空間のスコープで。 (あなたのプロジェクトにネームスペースがあることを願っています...) – Brian

+0

@Brian単にクラス外で定義するだけで、プロジェクト内の他の列挙型の名前と競合する可能性があります。 (私が "enum SomeClass_SomeEnum {...}"と定義している場合を除きますが、それよりもエレガントなものが欲しかったです) – AdyAdy

+0

@AdyAdy名前が矛盾しているという問題がある場合は、スコープ付き列挙型を使用できます。 – skypjack

答えて

3

あなたは(私は本当の問題だ何を言うことができない)の理由のためのクラス定義であなたの列挙型を囲みたい場合、あなたはまだ導入することができますクラステンプレートではなく、列挙型を含むもう1つのクラスを作成し、クラステンプレートからそのクラスを継承します。それで全部です。一例として、

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; 
関連する問題