Angle
クラスを実装する次の簡略化されたテンプレートメタプログラミングコードを考えてみます。このクラスは、360度のモジュロ値を内部的に格納します。メタプログラミングを使用した自動+クラス内定数定数化
#include <iostream>
#include <typeinfo>
template<int N, int D>
struct Modulus
{
static auto const value = N % D;
};
template<int N>
struct Angle
{
static auto const value = Modulus<N, 360>::value; // ERROR
//static int const value = Modulus<N, 360>::value; // OK
//static auto const value = N % 360; // OK
typedef Angle<value> type;
};
int main()
{
std::cout << typeid(Angle<30>::type).name() << "\n";
std::cout << typeid(Angle<390>::type).name() << "\n";
return 0;
}
のVisual C++ 2010 ExpressでIdeone
の出力に、私はstatic auto const = Modulus<N, 360>::value
を行うことができますが、MinGWのgccの4.7.2(Nuwen distro)またはIdeone(GCC 4.5.1)で私は明示的に示すために、どちらか持っていますstatic int const value = Modulus<N, 360>::value
と入力してください。auto
と完全なモジュール式をstatic auto const value = N % 360;
として使用する必要があります。
質問:新しいC++ 11標準に合ったコンパイラはどれですか?
はい、gcc 4.5.1ではC++ 11のサポートはまだ不完全ですので、http://gcc.gnu.org/projects/cxx0x.htmlをチェックして、どのバージョンがどのバージョンで利用可能か確認してください。 –
@hvd、間違っています。それらはconstexprと宣言しなければなりません。 –
@SegFault私もMinGW 4.7でこれらのエラーを取得します – TemplateRex