为什么函数内定义的结构不能用作std :: for_each的函子?

Osw*_*ald 7 c++ templates class local-class

以下代码将无法编译.编译器抱怨*没有匹配函数来调用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());
}
Run Code Online (Sandbox Code Playgroud)

当我struct FlipFunctor在函数之前移动时flip_all,代码会编译.

完整的错误消息:

没有用于调用'for_each的匹配函数(std :: _ Rb_tree_iterator <std :: pair <Element*const,Element*>>,std :: _ Rb_tree_iterator <std :: pair <Element*const,Element*>>,flip_all(std) :: map <Element*,Element*,std :: less <Element*>,std :: allocator <std :: pair <Element*const,Element*>>>)):: FlipFunctor)'

Jam*_*lis 13

std::for_each是一个功能模板; 其中一个模板参数是函数参数的类型.

您不能将本地类型用作模板参数.这只是目前语言中的限制.在即将推出的C++,C++ 0x版本中,此限制已被删除,因此您可以使用本地类型作为模板参数.

Visual C++ 2010已经支持使用本地类作为模板参数; 其他编译器的支持可能会有所不同.我猜任何支持C++ 0x lambdas的编译器也支持使用本地类作为模板参数(这可能不完全正确,但它会有意义).

  • C++ 03:*几乎*允许您在其使用点附近方便地定义ad-hoc仿函数.:-P (2认同)