2016-03-28 4 views
0

テンプレートパラメータNがconstexpr関数を使用して計算されるstd::bitsetクラスのエイリアスを入力しようとしています。しかし、このアプローチは壁に乗っているようです。ビットセットテンプレートパラメータのconstexpr関数の呼び出し

コードは現在、次のようになります。

static constexpr std::size_t ComponentCount() noexcept { 
    return 3U; 
} 

static constexpr std::size_t TagCount() noexcept { 
    return 5U; 
} 

using Bitset = std::bitset<ComponentCount() + TagCount()>; 

そして、次のように私が受けてるのエラーがある:あなたの助けのための

1>error C2975: '_Bits': invalid template argument for 'std::bitset', expected compile-time constant expression 
1> note: see declaration of '_Bits' 

感謝。使用して、@MattWeberのコメントで示されているように

+1

あなたのコードはVisual Studio 2015 Update 1とwebcompiler.cloudapp.netでコンパイルされます。 –

+0

Hrmmそれは非常に奇妙です。また、Visual Studio 2015(特にバージョン14.0.23107.0)も実行しています。私はこれが "アップデート1"かどうかは分かりませんが、非常にうまくいかないかもしれません.14.1がアップデート1に対応すると仮定します。 –

+0

私はそれがRTMだと信じています。私のバージョンは14.0.24720.00です。アップデート1で修正されたconstexprバグの[多くの] https://blogs.msdn.microsoft.com/vcblog/2015/12/02/constexpr-in-vs2015-update-1/がありました。ショット。 –

答えて

0

事実が判明したので、元の質問には十分な文脈が含まれていませんでした。問題はやや微妙になりました。

は、ここに私のコードが見えたかのより正確な表現です:

template 
< 
    typename ComponentList, 
    typename TagList, 
    typename SignatureList 
> 
struct Settings { 
    // ... 

    static constexpr std::size_t ComponentCount() noexcept { 
     return 3U; 
    } 

    static constexpr std::size_t TagCount() noexcept { 
     return 5U; 
    } 

    // ... 

    using Bitset = std::bitset<ComponentCount() + TagCount()>; 

    // ... 
}; 

このアプローチは、私には大丈夫に見えた、と任意のコンパイラの警告か何かを私に提供しませんでした。元の質問に記載されたコンパイラのエラーです。 (テンプレートパラメータを削除した後に、より具体的にか)この単純化を行った後

struct Settings { 
    static constexpr std::size_t ComponentCount() noexcept { 
     return 3U; 
    } 

    static constexpr std::size_t TagCount() noexcept { 
     return 5U; 
    } 

    using Bitset = std::bitset<ComponentCount() + TagCount()>; 
}; 

:私はより正確に問題を特定するための試みで問題をさらに簡略化されたときに

はしかし、私はこれで終わりましたVS2015は、のエラーをComponentCount()TagCount()の両方の関数呼び出しで検出し、それらを赤で強調表示しました。コンパイラは、定数式と同じ構造体に含まれる静的なconstexpr関数を表示できないようですか?奇妙な。 const式を定義する前に型のエイリアシングを試みている可能性があります。

次のようにテンプレート構造体のためのソリューションだった

using ThisType = Settings<ComponentList, TagList, SignatureList>; 

// ... 

using Bitset = std::bitset<ThisType::ComponentCount() + ThisType::TagCount()>; 

しかし、このアプローチは、非テンプレート構造体のために動作しません。その場合の別のアプローチについては、私の他のStackOverflow postを参照してください。

0

コンパイラのバージョンと現在のwebcompiler.cloudapp.net 19.00.23720.0出力8.だからつかむんあなたのコード

int main() 
{ 
    cout << Bitset{}.size() << "\n"; 
} 

を使用して、この小さなテストプログラム(2016年1月20日を建て)最新のVisual Studioを開き、コンパイラのバージョンを確認します(19.00.23720.0より大きい場合は動作するはずです)。

関連する問題