が、これは(両方の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
続きますか?
FWIW、STD = C++ 14問題はありません。しかし、あなたが再生のために投稿したコード全体が 'main()'の '}'に34行しかないときに 'main.cpp' 37行がどのようにエラーを報告するのか混乱しています。 – WhozCraig
@WhozCraigビジュアルの実装には2行(インクルードと '_getch()')が2行あります。私にも不思議なことに、ファイルの最後の後にエラーを報告する... –
'A ()'この構文は何をしていますか? –