将本地结构传递给count_if

时间:2013-12-27 17:16:16

标签: c++ g++

我试图将一个匿名结构传递给std :: count_if,这是无法编译的。

当我尝试编译时(使用g ++ 4.5.3,不使用c ++ 03或c ++ 11扩展),我在fail()方法中收到错误,但是pass()方法没有那个错误。

In function ‘void fail()’:
Test.cpp:34:24: error: no matching function for call to ‘count_if(std::map<int, int>::iterator, std::map<int, int>::iterator, fail()::<anonymous struct>&)’

如果我将结构化为命名结构,我会得到类似的错误。我不明白为什么在函数内外声明它应该有所作为。我错过了什么?

#include <map>
#include <algorithm>

typedef std::map<int, int> Map;

void fail()
{
  struct {
    bool operator()(Map::value_type const& value)
    {
      return value.second > 0;
    }
  } checker;

  Map map;
  std::count_if(map.begin(),
                map.end(),
                checker);
}

struct Checker {
  bool operator()(Map::value_type const& value)
  {
    return value.second > 0;
  }
};
void pass()
{
  Map map;
  Checker checker;
  std::count_if(map.begin(),
                map.end(),
                checker);
}

2 个答案:

答案 0 :(得分:3)

根据C ++ 03规范,不允许使用本地类型作为模板参数。 2011年修订版C ++取消了这一限制。

限制的基本原因是关于为本地类型创建唯一名称的问题。但是,开发了一些技术来创建适用于所有系统的唯一名称。

答案 1 :(得分:0)

在C ++ 03,C ++ 98中,本地/未命名类型不能用作模板参数(STL算法)

使用-std=c++11标志

进行编译

请参阅C++11 FAQ

由于使用了C ++ 11,为什么不简单地使用lambda函数std::count_if