考虑以下代码:
struct S
{
union
{
int arr1[10];
char arr2[sizeof(arr1)];
};
};
在c ++ 03和c ++ 11模式下使用gcc 4.9.2成功编译。但是,当我将S
更改为如此模板时:
template <size_t N>
struct S
{
union
{
int arr1[N];
char arr2[sizeof(arr1)];
};
};
我收到以下错误输出:
error: int S<10ul>::<anonymous union>::arr1 [10]’ is inaccessible
int arr1[N];
error: within this context
char arr2[sizeof(arr1)];
Clang仅在c ++ 11模式下编译两个版本。我很好奇这里的正确行为是什么。也许我应该明确说明arr2
大小是sizeof(int) * N
?
答案 0 :(得分:16)
你的工会是匿名的。因此,编译器将在类级别创建arr1
和arr2
。
因此,char arr2[sizeof(arr1)];
无法正确引用arr1
。
这是一种解决方法:
template <size_t N>
struct S
{
union A
{
int arr1[N];
char arr2[sizeof(arr1)];
};
};
在这里编译好:https://ideone.com/JcvOYg
通过命名联合,我们阻止编译器直接包含它。然后它可以正确检索arr1
。
但这也意味着arr1
和arr2
不再是S
的成员。
最后,Members can be defined in terms of other members
但后者必须是&#34;可以找到&#34;由编译器。
答案 1 :(得分:6)
你可以这样做:
template <size_t N>
class S
{
private:
union
{
int arr1[N];
char arr2[N*sizeof(int)];
};
};