【问题标题】:Explain GCC error after using an object accidentally declared as a function使用意外声明为函数的对象后解释 GCC 错误
【发布时间】:2011-03-10 11:43:32
【问题描述】:

以下是语言新手常见的拼写错误,他们认为自己在定义一个对象,但实际上是在声明一个函数:

struct T
{
   void foo() {}
};

int main()
{
   T obj();
   obj.foo();
}

GCC 4.1.2 的错误是:

In function 'int main()':
Line 9: error: request for member 'foo' in 'obj', which is of non-class type 'T ()()'
compilation terminated due to -Wfatal-errors.

为什么消息T ()()中报告的类型是?我期待T ()

【问题讨论】:

    标签: c++ gcc most-vexing-parse


    【解决方案1】:

    IIRC 这只是一个编译器错误。 GCC 4.4 说 T() 而 4.2 说 T()() 对我来说。

    【讨论】:

    • 哦,嗯。是的,4.4.1 也给了我预期的输出。谢谢!
    【解决方案2】:

    当你意识到你通常不会在不命名函数的情况下写出函数类型时,最好理解这个错误,但对于函数指针来说更常见一点。

    例如,int (*fooPtr)() 命名指针。如果省略名称,则为 int (*)()。现在,从函数指针到函数类型会给你int ()()

    这里没有真正的标准,因为 ISO C++ 没有为所有类型定义规范名称。例如,const volatile intvolatile const int 的类型相同,并且两种形式都不是规范的。

    【讨论】:

    • 好的,但是当你为 std::function 提供一个“函数类型”时,你写的是std::function<int()>(...)
    • 确实如此。事实上int()() 可以(应该?)被解析为一个返回int()(!)的函数。但问题是解释 GCC 错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多