C ++ union元素大小基于其他元素大小

时间:2015-03-02 22:19:12

标签: c++ c++11

考虑以下代码:

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

2 个答案:

答案 0 :(得分:16)

你的工会是匿名的。因此,编译器将在类级别创建arr1arr2
因此,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

但这也意味着arr1arr2不再是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)];
    };
};