以下代码并非compile g ++ 4.8.1
struct Layers
{
typedef struct Widgets { } Widgets;
virtual void fun(void)
{
struct Widgets w;
}
Widgets w, x, y, z ;
};
但是,如果我只使用Widgets w, x, y ; //Remove variable z
compiles!
为什么会这样?我在这里缺少什么?
答案 0 :(得分:7)
那是因为你typedef
结构Widgets
,请检查错误:
error: using typedef-name 'Layers::Widgets' after 'struct'
因此,解决方法是删除函数中的struct
。总结为:
struct Layers
{
typedef struct Widgets { } Widgets;
virtual void fun(void)
{
Widgets w;
}
Widgets w, x, y, z ;
};
int main() { }
在此处详细了解:Difference between 'struct' and 'typedef struct' in C++?
答案 1 :(得分:7)
它是GCC中的一个错误
参考: - Bug 46206 - using typedef-name error with typedef name hiding struct name
G ++拒绝以下代码:
class Foo { bool a, b, c, d; typedef struct Bar { } Bar; virtual void foo(void) { struct Bar bar; } }; example.cc: In member function ‘virtual void Foo::foo()’: example.cc:6: error: using typedef-name ‘Foo::Bar’ after ‘struct’ example.cc:4: error: ‘Foo::Bar’ has a previous declaration here example.cc:6: error: invalid type in declaration before ‘;’ token
但接受许多类似的例子,包括:
class Foo { bool a, b, c; typedef struct Bar { } Bar; virtual void foo(void) { struct Bar bar; } };
此行为可在x86_64-redhat-linux(4.1.2和4.4.0)和i386-pc-solaris2.11(4.2.4,4.3.4和4.5.1)上重现
我不确定这是否严格合法或不符合标准,但接受其中一种情况似乎没有意义,而不是另一种......
这似乎已在最新的 GCC 4.9.0
中修复