Почему структура, определенная внутри функции, не может использоваться как функтор для std :: for_each? - PullRequest
7 голосов
/ 29 декабря 2010

Следующий код не скомпилируется.Компилятор жалуется на * отсутствие соответствующей функции для вызова 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>, std :: _ Rb_tree_iterator>, flip_all (std :: map, std :: allocator>>) :: FlipFunctor) '

Ответы [ 2 ]

13 голосов
/ 29 декабря 2010

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

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

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

0 голосов
/ 29 декабря 2010

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

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

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

...