Подтвердить что ты не робот

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

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

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

test.cpp: 24: ошибка: нет соответствующей функции для вызова в \u2018foreachArg (int &, char * &, processSubs (int, char *):: Processor &)\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);
}
4b9b3361

Ответ 1

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

С++ 11 меняет это, поэтому вы можете исправить это, установив свой компилятор для использования С++ 11.

Ответ 2

Вы не можете создавать шаблоны с локальными классами в С++ 03.

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

Ответ 3

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

Ответ 4

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

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