2

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

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 ()

4

2 回答 2

5

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

于 2011-03-10T11:47:13.643 回答
2

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

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

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

于 2011-03-10T12:33:06.087 回答