Почему я получаю эту ошибку «переобъявлен как символ другого типа»?

У меня есть такой функтор,

class PrintParentheses
{
public:
    PrintParentheses(unsigned pairsCount)
    {}

    void operator ()() {}
};

Внутри main() я использую его так:

#include <iostream>

int main()
{
  unsigned pairsCount = 0;

  // Error:  ‘PrintParentheses pairsCount()’ redeclared as different kind of symbol
  PrintParentheses(pairsCount)();

  PrintParentheses(5)(); // But this works

}

Позиции ошибок отмечены внутри самого кода. Я тестировал и GCC-4.6, и clang-3.1. Оба дают одну и ту же ошибку.


person Hindol    schedule 08.10.2012    source источник
comment
PrintParentheses(pairsCount)(); объявляет pairsCount как функцию, возвращающую PrintParentheses. Я знаю, что об этом спрашивали несколько раз, но у меня возникли проблемы с поиском.   -  person    schedule 08.10.2012
comment
@hvd, не видел, чтобы он так спрашивал. Синтаксис отличается от обычного. Должен сказать, добавленные скобки сначала произвели на меня впечатление.   -  person chris    schedule 08.10.2012
comment
@chris Возможно, вы правы, чаще всего встречающийся синтаксис, вызывающий путаницу, - это T1 x(T2()), а не T1(x)(), хотя основная проблема та же.   -  person    schedule 08.10.2012
comment
@hvd, если я чему-то и научился у SO, так это тому, что один и тот же вопрос можно задать разными способами. Я часто вижу Class obj(); при попытке явного вызова конструктора по умолчанию.   -  person chris    schedule 08.10.2012
comment
Я взял на себя смелость упростить код. В общем, вы должны попытаться предоставить краткие примеры кода, из которых можно легко воспроизвести проблему. Большая часть кода в вашем оригинале не имеет значения.   -  person juanchopanza    schedule 08.10.2012
comment
@juanchopanza Спасибо за это. Я упростил свой код, но не знал, что некоторые части не имеют значения, пока не увидел ответ.   -  person Hindol    schedule 08.10.2012
comment
@Hindol, правда, ты сделал попытку, и это здорово, но всегда старайся сократить как можно больше, чтобы получить оптимальный шанс решить ее, даже не спрашивая, или давая людям, когда ты спрашиваешь, очень очевидный образец, который требует очень мало размышлений, чтобы обнаружить ошибку, если кто-то способен ее обнаружить.   -  person chris    schedule 08.10.2012


Ответы (1)


Это читается как pairsCount — функция, не принимающая аргументов и возвращающая PrintParentheses. Из-за так называемого самого неприятного синтаксического анализа это следует рассматривать как объявление функции. Вместо этого создайте объект и используйте его:

PrintParentheses obj(pairsCount);
obj();
person chris    schedule 08.10.2012