次のコードスニペットは、g++およびclang++で正常に機能します。
// bsp1.cc
class A {
public:
A(int, char const *);
int value;
const char * name;
};
class B {
public:
static const A many_as[];
};
A const B::many_as[]
{ { 0, "zero" },
{ 1, "one" },
{ 2, "two" },
{ 3, "three" },
{ 77, 0 } };
テンプレート化するクラスBを変更すると、次のようになります。
// bsp2.cc
class A {
public:
A(int, char const *);
int value;
const char * name;
};
template<typename T>
class B {
public:
static const A many_as[];
};
template<>
A const B< int >::many_as[]
{ { 0, "zero" },
{ 1, "one" },
{ 2, "two" },
{ 3, "three" },
{ 77, 0 } };
clang++は次の場合に失敗します。
tmp/bsp2.cc:19:1: error: expected ';' after top level declarator
{ { 0, "zero" },
^
1 error generated.
g++はまだこれに満足しています。
バージョン情報:g ++(Debian 4.7.2-4)4.7.2、clangバージョン3.3(トランク171722)
として追加する=
と
A const B< int >::many_as[] =
また、clang++は幸せです。
私の質問:
- bsp2.ccは有効ですか?(言い換えれば、これはclang ++の問題ですか?)
- ?がある場合とない場合のbsp2の間に意味上の違いはあり
=
ますか?(つまり、バージョンを=
「回避策」として使用できますか?) - (ボーナス質問:)これが説明されているC ++ 11標準の段落を教えていただけますか?