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

时间:2010-12-29 01:47:37

标签: 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());
}

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

完整的错误消息:

  

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

2 个答案:

答案 0 :(得分:13)

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

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

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

答案 1 :(得分:0)

当我尝试编译代码时出现了不同的错误:

  

错误:'flip_all(__ gnu_debug_def :: map,std :: allocator&gt;&gt;):: FlipFunctor'使用本地类型'flip_all(__ gnu_debug_def :: map,std :: allocator&gt;&gt;):: FlipFunctor'

这实际上是预期的,因为函数本地类型(例如此处的FlipFunctor)具有内部链接,并且模板类型必须具有外部链接。由于std :: for_each 的第三个参数是模板,因此无法将函数本地类型传递给它。