C++ C++;删除变量时出现奇怪的编译错误

C++ C++;删除变量时出现奇怪的编译错误,c++,C++,以下代码不符合g++4.8.1的要求 然而,如果我只使用小部件w,x,y//删除变量zit 为什么会这样?我在这里遗漏了什么?这是因为您typedef'd了结构Widgets,请检查错误: 错误:在“struct”之后使用typedef名称“Layers::Widgets” 因此,解决方法是删除函数中的struct。总结起来: struct Layers { typedef struct Widgets { } Widgets; virtual void fun(void)

以下代码不符合g++4.8.1的要求

然而,如果我只使用
小部件w,x,y//删除变量z
it


为什么会这样?我在这里遗漏了什么?

这是因为您
typedef
'd了结构
Widgets
,请检查错误:

错误:在“struct”之后使用typedef名称“Layers::Widgets”

因此,解决方法是删除函数中的
struct
。总结起来:

struct Layers
{
    typedef struct Widgets { } Widgets;

    virtual void fun(void) 
    {
        Widgets w;
    }

    Widgets w, x, y, z ;
};

int main() { }
在这里阅读更多信息:

这是GCC中的一个错误

参考:-

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)上重现

我不确定这是否严格合法或不符合标准,但接受其中一种情况而不接受另一种情况似乎没有意义


这似乎在最新的GCC4.9.0中得到了修复。这并不能解释为什么删除“z”会使代码编译。奇怪的是,删除“z”看起来像一个语言解析器/功能/(有点类似于一个bug)。我不太清楚为什么删除“z”会使代码编译成功。发布此答案时未考虑。@user3159253这主要是一个bug,是的。应该尝试使用另一个编译器来生成sure@P0W:我没有看到删除
z
会删除错误的行为。你是说错误在
struct窗口小部件w上fun()
中的code>声明,并且从后一个声明中删除
z
会使其变得正确,因此
fun()
中的声明不再出错?就像我说的-我不能重新编程,启动也没有意义。它在clang++4下为我编译。2@rano是啊,我刚才也是!如果您给typedef一个不同的名称,它就会工作。对于eg
typedef结构小部件{}Widgets这很有趣,有人知道一种更深入地探索g++解析器的方法吗?哈哈,这里有一个和你一样的例子。这可能是提高农场声誉的好方法:D@rano说真的,我仍然不知道真正的问题,只是碰巧在bugzillaI上搜索了类似的bug,我不确定它是否在4.9.0中得到了修复(我还没有安装)。保罗·卡里尼最后的评论是他恢复了补丁。@MichaelBurr:更奇怪的是,他声称它只在linux上工作。这让我觉得gcc在内部某处调用UB。。。
class Foo
{
    bool a, b, c;
    typedef struct Bar { } Bar;
    virtual void foo(void) {
        struct Bar bar;
    }
};