2016-08-01 14 views
0

が、これは(両方のC++ 11とC++ 14)とinstantiates a and a2 as expectedをコンパイルし、gccで今すぐ次のスニペットは失敗しました暗黙の静的メンバの初期化は、Visual Studioによって

#include <iostream> 
using namespace std; 

template<int i, typename T = int> struct A 
{ 
    T num = i; 
    A<i, T>() 
    { 
     cout << "Instantiated a A<" << i << ">" << endl; 
    } 
}; 

template<int i, int i2> struct B 
{ 
    static A<i> a; 
    static A<i * i2> a2; 
}; 
template<int i, int i2> A<i> B<i, i2>::a{}; 
template<int i, int i2> A<i * i2> B<i, i2>::a2{}; 

template<typename T> struct C 
{ 
    static void doSomething() 
    { 
     cout << "Have a A<" << T::a.num << "> and a A<" << T::a2.num << "> in C" << endl; 
    } 
}; 

int main() { 
    typedef C<B<2, 2>> c; 
    cout << "Typedefined a C\nCalling static member function to initialize C<B<2, 2>>'s B<2, 2>'s A<>s" << endl; 
    c::doSomething(); 
    return 0; 
} 

してください。

WhozCraigのおかげで、これもclangでコンパイルされます。

ただし、Visual C++(2015版)では、解析エラーが発生します。

main.cpp(37) error C2143: syntax error: missing ';' before '<end Parse>' 

はここで何が起こっているか、いくつかのノート

main.cpp(19): note: while compiling class template static data member 'A<2,int> B<2,2>::a' 
main.cpp(26): note: see reference to class template instantiation 'B<2,2>' being compiled 
main.cpp(25): note: while compiling class template member function 'void C<B<2,2>>::doSomething(void)' 
main.cpp(33): note: see reference to function template instantiation 'void C<B<2,2>>::doSomething(void)' being compiled 

main.cpp(33): note: see reference to class template instantiation 'C<B<2,2>>' being compiled 

続きますか?

+0

FWIW、STD = C++ 14問題はありません。しかし、あなたが再生のために投稿したコード全体が 'main()'の '}'に34行しかないときに 'main.cpp' 37行がどのようにエラーを報告するのか混乱しています。 – WhozCraig

+0

@WhozCraigビジュアルの実装には2行(インクルードと '_getch()')が2行あります。私にも不思議なことに、ファイルの最後の後にエラーを報告する... –

+2

'A ()'この構文は何をしていますか? –

答えて

3

私はテストケースを減らすことができた、問題を特定する(ビジュアルC++コンパイラのバグに表示される)と、回避策を見つける:これは打ち鳴らす3.8でコンパイル

#include <iostream> 
using namespace std; 

template<int i> struct A 
{ 
    int num = i; 
    A() {} 
}; 

template<int i> struct B 
{ 
    static A<i> a; 
}; 

// MSVC doesn't like this syntax 
//       ||| 
//       vvv 
template<int i> A<i> B<i>::a{}; 

// To fix the error, rewrite the above line in one of the below ways: 
// 
// template<int i> A<i> B<i>::a; 
// template<int i> A<i> B<i>::a = {}; 

int main() { 
    typedef B<2> B2; 
    cout << B2::a.num << endl; 
    return 0; 
} 
+0

ああ、マイクロソフト...ありがとう –

+1

Microsoftにバグを報告しましたか?もしそうなら、ここにバグレポートへのリンクを投稿してください。 – ildjarn

+0

@ildjarnいいえ、私はしませんでした。 – Leon

関連する問題