Почему структура, определяемая внутри функции, не может использоваться в качестве функтора для std :: for_each?

StackOverflow https://stackoverflow.com/questions/4550914

Вопрос

Следующий код не будет компилироваться. Компилятор жалуется на *нет совпадения функции для вызова for_each *. Почему это так?

#include <map>
#include <algorithm>

struct Element
{
    void flip() {}
};

void flip_all(std::map<Element*, Element*> input)
{
    struct FlipFunctor
    {
        void operator() (std::pair<Element* const, Element*>& item)
        {
            item.second->flip();
        }
    };

    std::for_each(input.begin(), input.end(), FlipFunctor());
}

Когда я двигаюсь struct FlipFunctor Перед функцией flip_all, код компилизируется.

Полное сообщение об ошибке:

Нет сопоставления функции для вызова 'for_each (std :: _ rb_tree_iterator u003Cstd::pairu003CElement* const, Element*> >, std :: _ rb_tree_iterator u003Cstd::pairu003CElement* const, Element*> >, flip_all (std :: map u003CElement*, Element*, std::lessu003CElement*> , Std :: Allocator u003Cstd::pairu003CElement* const, Element*> >>) :: flipfunctor) '

Это было полезно?

Решение

std::for_each это шаблон функции; Одним из параметров шаблона является тип аргумента функции.

Вы не можете использовать локальный тип в качестве аргумента шаблона. Это просто ограничение в настоящее время на языке. В предстоящем пересмотре C ++, C ++ 0x это ограничение удаляется, поэтому вы можете использовать локальные типы в качестве аргументов шаблонов.

Visual C ++ 2010 уже поддерживает использование локальных классов в качестве аргументов шаблонов; Поддержка в других компиляторах может варьироваться. Я предполагаю, что любой компилятор, который поддерживает C ++ 0x Lambdas, также поддержит использование локальных классов в качестве аргументов шаблонов (это может быть не совсем так, но это имеет смысл).

Другие советы

Я получаю другую ошибку, когда пытаюсь скомпилировать ваш код:

Ошибка: 'flip_all (__ gnu_debug_def :: map, std :: allocator >>) :: flipfunctor' использует локальный тип 'flip_all (__ gnu_debug_def :: map, std :: allocator>>) :: flipfunctor'

Это на самом деле следует ожидать, потому что функция локального типа (например, ваш Flipfunctor здесь) имеет внутреннюю связь, а тип шаблона должен иметь внешнюю связь. Поскольку третий параметр std :: for_each является Шаблон, вы не можете передать в него что -то вроде локального типа.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top