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

Я пытаюсь использовать локальный класс в качестве функтора и получить ошибку компилятора с помощью 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);
}

4 ответа

Решение

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

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

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

Вы не можете создавать экземпляры шаблонов с локальными классами в C++03.

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

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

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

Другие вопросы по тегам