C ++ локальный класс как функтор

Я пытаюсь использовать локальный класс в качестве функтора и получить ошибку компилятора с помощью g ++ (3.4.6).

Размещение ниже класса (Processor ) в глобальной области видимости устраняет ошибку, поэтому я предполагаю, что ошибка происходит из-за функции локальных структур / классов. Я бы предпочел иметь классы внутри функции для ясности кода и простоты использования. Хотите узнать, есть ли обходное решение, чтобы сделать приведенный ниже код работающим.

test.cpp: 24: ошибка: нет соответствующей функции для вызова \ u2018foreachArg (int &, char* &, processSubs (int, char *) :: Процессор и) \ u2019

template <class Functor>
void foreachArg(int n, char *args[], Functor& f)
{
    for(int i=0; i<n; ++i)
        f(args[i]);
}

int processSubs(int argc, char *args[])
{
    class Processor
    {
        public:
            void operator()(const char *arg)
            {
            }
    };

    Processor p;
    foreachArg(argc, args, p);
}

int main(int argc, char *argv[])
{
    processSubs(argc, argv);
}
 Bo Persson19 мар. 2012 г., 16:10
Нет, эти два варианта используют компилятор, совместимый с C ++ 11, или перемещают класс за пределы функции.
 Luis Machuca09 авг. 2012 г., 18:32
Есть третий вариант - использовать «местный» функтор. Boost добавляет один, например.
 Akanksh19 мар. 2012 г., 16:51
Посмотри пожалуйста:stackoverflow.com/a/2598272/294864 для ссылки на спецификацию до C ++ 11 относительно анонимных структур как аргументов шаблона.

Ответы на вопрос(4)

использование локальных классов для этого было невозможно до C ++ 11, а о C бесполезно в C ++ 11, потому что лямбды менее многословны.

Вы должны просто объявить свой класс вне функции.

Решение Вопроса

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

C ++ 11 меняет это, так что вы можете исправить это, настроив ваш компилятор на использование C ++ 11.

 Shanky19 мар. 2012 г., 16:05
к сожалению, с помощью компилятора (3.4.6 --- застрял в каменном веке: P), который не поддерживает c ++ 0x, так что ищите умный обходной путь
 bames5319 мар. 2012 г., 16:10
Там нет действительно обходной путь. У некоторых компиляторов есть расширение, разрешающее этот pre-C ++ 11, но не gcc, насколько я знаю. Если вы застряли с вашим текущим компилятором, я не думаю, что есть лучший вариант, чем вывести функтор из локальной области видимости. @Shanky
 Luis Machuca09 авг. 2012 г., 05:00
На самом деле есть некоторые обходные пути. Не уверен, что это работает в GCC 3.x, но в GCC 4.2 и 4.4 я использую очень простойLOCAL_FUNCTION идиома, основанная на наследовании и специализации шаблонов, которая делегирует фактический вызов функции внешним, базовым функторам, которые фактически перенаправляют на локальные. Boost, кажется, недавно запустил нечто подобное (и, как обычно, с Boost, гораздо лучше, но с огромной сложностью и стоимостью зависимости).

блона, как вы узнали здесь. C ++ 11 позволяет это. С gcc вы можете попробовать скомпилировать--std=c++0x

 Shanky19 мар. 2012 г., 16:04
к сожалению, с помощью компилятора (3.4.6 --- застрял в каменном веке: P), который не поддерживает c ++ 0x, так что ищите умный обходной путь

+ 03.

Кроме того, стандарт уже предоставляет функцию для этогоstd::for_each.

Ваш ответ на вопрос