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

时间:2014-04-24 05:36:15

标签: c++

以下代码并非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

为什么会这样?我在这里缺少什么?

2 个答案:

答案 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

中修复