2016-09-13 9 views
5

導入されたC++ 11ベースのenumビットセットはhereです。プログラムはclang++ -std=c++11 -o main main.cc経由で打ち鳴らす++(打ち鳴らすバージョン3.8.1(タグ/ RELEASE_381 /最終))を使用して、うまくコンパイルプログラムはclang ++を使用してコンパイルしますが、g ++はRAMを使い果たして失敗します。

#include <bitset> 
#include <type_traits> 
#include <limits> 

template <typename TENUM> 
class FlagSet { 

private: 
    using TUNDER = typename std::underlying_type<TENUM>::type; 
    std::bitset<std::numeric_limits<TUNDER>::max()> m_flags; 

public: 
    FlagSet() = default; 

    FlagSet(const FlagSet& other) = default; 
}; 

enum class Test 
{ 
    FIRST, 
    SECOND 
}; 


int main(int argc, char *argv[]) 
{ 
    FlagSet<Test> testFlags; 
    return 0; 
} 

:私はいくつかのサンプルプログラムを思い付きました。 しかし、代わりにg++ -std=c++11 -o main main.cc経由でg ++(g ++(GCC)6.2.1 20160830)を使用すると、コンパイラは最終的にシステムメモリを使い果たします。これはg ++の問題ですか?またはこのコードは何とか標準に準拠していませんか?

+2

'のstd ::ビットセット<はstd :: numeric_limitsの :: MAX()>'それは一つの大きなビットセットです。 – Borgleader

+2

g ++とclangが異なる基底型を使用しているのだろうかと思います。 – NathanOliver

+0

@NathanOliver AFAIK enumクラスのデフォルトの基になる型は32ビットintですか? (または、デフォルトでは、通常の列挙型ではないenumクラスを宣言することができるので、標準で指定されているものがあります) – Borgleader

答えて

5

std::bitset<std::numeric_limits<TUNDER>::max()>は256Mバイト(32ビットの場合はintと仮定)です。 clangが正常にコンパイルするのはすばらしいことですが、gccのメモリが不足していることは特に驚くことではありません。

列挙子をビットセットインデックスとして使用する場合は、最大の列挙子を別のテンプレートパラメータとして渡す必要があります。まだ(Max and min values in a C++ enum)列挙の範囲を見つける方法がありません。

例:

template <typename TENUM, TENUM MAX> 
class FlagSet { 

private: 
    std::bitset<MAX + 1> m_flags; 

public: 
    FlagSet() = default; 

    FlagSet(const FlagSet& other) = default; 
}; 

enum class Test 
{ 
    FIRST, 
    SECOND, 
    MAX = SECOND 
}; 

FlagSet<Test, Test::MAX> testFlags; 
+0

またはOPのmax()がenumの最高値を返すと予想されました。これは私の推測でした。いずれかの基本的なタイプの最大値を使用して、過度に言うには過激です。 – Borgleader

+0

まあ、私はちょうどここから盲目的にコピーしていた:http://stackoverflow.com/a/31906371/1255016私は答えを編集する必要がありますね... – hfhc2

+0

@ hfhc2ああ...その答えは非 'クラスを使用している'enumなので、基底型の' char'があります。スペースはまだ無駄ですが(128または256ビット、おそらく)、コンパイラはクラッシュしません。 – ecatmur

関連する問題