2012-10-11 27 views
6

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標準に合ったコンパイラはどれですか?

+0

はい、gcc 4.5.1ではC++ 11のサポートはまだ不完全ですので、http://gcc.gnu.org/projects/cxx0x.htmlをチェックして、どのバージョンがどのバージョンで利用可能か確認してください。 –

+0

@hvd、間違っています。それらはconstexprと宣言しなければなりません。 –

+0

@SegFault私もMinGW 4.7でこれらのエラーを取得します – TemplateRex

答えて

1

コードは有効です。 Visual C++はそれを受け入れる権利があり、gccはそれを拒否するのは間違いです(完全性のために、Clang 3.1もコードを受け入れます)。仕様は、([dcl.spec.auto]/4 C++ 11 7.1.6.4)と述べている:

auto型指定子も使用することができる...と静的データメンバを宣言にブレースまたは同等のイニシャライザのメンバー仕様のクラス定義内に表示されます。

valueは静的データメンバーです。 ブレースまたは等しいイニシャライザ(宣言の一部に= Modulus<N, 360>::valueの部分)があり、イニシャライザはクラス定義のメンバ指定内に表示されます(つまり、それは人が "インラインイニシャライザ")。

+0

+1して受け入れます。どうもありがとう!バグレポートを提出する最も適切な方法は何ですか? – TemplateRex

+0

@rhalbersma:GCCには[Bugzillaデータベース](http://gcc.gnu.org/bugzilla/)があります。私は彼らのバグ報告手続きに精通していません。最初にこれが既に報告されているかどうかを調べることをお勧めします。 –

関連する問題