事実が判明したので、元の質問には十分な文脈が含まれていませんでした。問題はやや微妙になりました。
は、ここに私のコードが見えたかのより正確な表現です:
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を参照してください。
あなたのコードはVisual Studio 2015 Update 1とwebcompiler.cloudapp.netでコンパイルされます。 –
Hrmmそれは非常に奇妙です。また、Visual Studio 2015(特にバージョン14.0.23107.0)も実行しています。私はこれが "アップデート1"かどうかは分かりませんが、非常にうまくいかないかもしれません.14.1がアップデート1に対応すると仮定します。 –
私はそれがRTMだと信じています。私のバージョンは14.0.24720.00です。アップデート1で修正されたconstexprバグの[多くの] https://blogs.msdn.microsoft.com/vcblog/2015/12/02/constexpr-in-vs2015-update-1/がありました。ショット。 –