2017-04-05 14 views
2

強く型付けされたenum(enumクラス)をテンプレートパラメータの中で宣言したいと思います。厳密に型指定されたenumを "enum class"で参照することはできないため、すでに定義されている場合は機能しません。テンプレートパラメータ内の前方宣言クラスenum?

ファイル2が列挙型の定義を認識しない可能性があるため、これを実行します。これをどうやって解決するのですか?

がコンパイル:

// File 1 
template<typename TEnum> 
class TSomeClass 
{ 
    int m_someMember; 
}; 

// File 2 
struct MyStruct 
{ 
    TSomeClass<enum class MyEnum : int> someClassInstance; 
}; 

enum class MyEnum : int 
{ 
    someIdentifier 
}; 

はコンパイルされません:

// File 1 
template<typename TEnum> 
class TSomeClass 
{ 
    int m_someMember; 
}; 

enum class MyEnum : int 
{ 
    someIdentifier 
}; 

// File 2 
struct MyStruct 
{ 
    TSomeClass<enum class MyEnum : int> someClassInstance; 
        //^ error: "reference to scoped enumeration must use 'enum' not 'enum class'" 
}; 

がいずれかのコンパイルされません:

// File 1 
template<typename TEnum> 
class TSomeClass 
{ 
    int m_someMember; 
}; 

// File 2 
struct MyStruct 
{ 
    TSomeClass<enum MyEnum : int> someClassInstance; 
}; 

enum class MyEnum : int 
     //^ error: "enumeration previously declared as unscoped" 
{ 
    someIdentifier 
}; 

を追加注意として、Visual Studioで動作するようです2015. しかし、Clang 4.0.0では「スコープ付き列挙への参照は「enum」を使用する必要があります。 'enum class'ではありません。

編集:私は、(テンプレートパラメータの外にある)enumの通常の前方宣言の代替方法を探しています。 構造体/クラスの前方宣言は、テンプレートパラメータ内でうまく動作しますが、なぜ "enum class"では動作しませんか?

+0

テンプレートパラメータの内側にそれを行うのはなぜ? –

+0

私の返信をJarod42と私の編集を参照してください。 – kokole

答えて

0

あなたは最初の列挙型の宣言を転送することができる:

enum class MyEnum : int; 

struct MyStruct 
{ 
    TSomeClass<MyEnum> someClassInstance; 
}; 
+0

申し訳ありませんが、これらの列挙型と構造体はツールによって自動生成されており、その多くが存在するため、最も簡単な方法はテンプレートパラメータで宣言することです。あなたが提案しているものの代替案を探しています。 – kokole