Почему структура, определяемая внутри функции, не может использоваться в качестве функтора для std :: for_each?
-
13-10-2019 - |
Вопрос
Следующий код не будет компилироваться. Компилятор жалуется на *нет совпадения функции для вызова 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 является Шаблон, вы не можете передать в него что -то вроде локального типа.