考虑以下代码:
struct S
{
union
{
int arr1[10];
char arr2[sizeof(arr1)];
};
};
Run Code Online (Sandbox Code Playgroud)
它在c ++ 03和c ++ 11模式下与gcc 4.9.2成功编译.但是,当我改为S像这样的模板时:
template <size_t N>
struct S
{
union
{
int arr1[N];
char arr2[sizeof(arr1)];
};
};
Run Code Online (Sandbox Code Playgroud)
我得到以下错误输出:
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?
Tel*_*kis 16
你的工会是匿名的.因此,编译器会创建arr1并arr2在类级别.
因此,char arr2[sizeof(arr1)];不会arr1正确引用.
这是一个解决方法:
template <size_t N>
struct S
{
union A
{
int arr1[N];
char arr2[sizeof(arr1)];
};
};
Run Code Online (Sandbox Code Playgroud)
在这里编译好:https://ideone.com/JcvOYg
通过命名联合,我们阻止编译器直接包含它.然后它可以arr1正确检索.
但是,这也意味着,arr1和arr2没有不S的成员了.
最后,Members can be defined in terms of other members但后者必须由编译器"找到".
你可以这样做:
template <size_t N>
class S
{
private:
union
{
int arr1[N];
char arr2[N*sizeof(int)];
};
};
Run Code Online (Sandbox Code Playgroud)