Объяснить ошибку GCC после использования объекта, случайно объявленного как функция - PullRequest
2 голосов
/ 10 марта 2011

Ниже приведена типичная опечатка для новичков в языке, которые считают, что они определяют объект, но фактически объявляют функцию:

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

Ответы [ 2 ]

5 голосов
/ 10 марта 2011

IIRC это просто ошибка компилятора.GCC 4.4 говорит T(), а 4.2 говорит T()() для меня.

2 голосов
/ 10 марта 2011

Эту ошибку лучше всего понять, когда вы понимаете, что обычно вы не пишете типы функций, не называя по крайней мере функции, но это немного более распространено для указателей функций.

Например, int (*fooPtr)() называет указатель. Если вы опустите имя, у вас есть int (*)(). Теперь переход от указателя на тип функции даст вам int ()().

Здесь нет реального стандарта, потому что ISO C ++ не определяет канонические имена для всех типов. Например, const volatile int соответствует типу volatile const int, и ни одна форма не является канонической.

...