以下代码片段在 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 标准的段落吗?