質問

VS2013ではこれをコンパイルできませんが、GCC 4.7.2でコンパイルします。私はVC ++がGCCと字幕の背後に遅れていることを理解していますが、特徴の面で拍手の後ろに遅れていますが、それは正確にそれが正確なものです。これはバグです。

template <int N>
struct factorial
{
    static const long value;
    static const long previous = factorial<N - 1>::value; //C2057: expected constant expression
};

template <int N>
const long factorial<N>::value = N*factorial<N - 1>::value;

template <>
struct factorial<0>
{
    static const long value = 1;
};
.

この問題の回避策を得ることができる方法を教えてはいけません、これが本番コードではないものではありません。たとえば、クラスの値を定義でき、問題は解決されていますが、クラスの外部に定義する必要があるとしましょう(VC2013はまだConstexprをサポートしていません)

役に立ちましたか?

解決

MSVCには、適切な2フェーズテンプレートコンパイルがありません。GCCは、factorial<N - 1>::valueを依存名として正しく見出し、2番目のフェーズで解決されますが、MSVCは最初のフェーズでそれを行う必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top