C++ 将本地结构传递给count\u,如果

C++ 将本地结构传递给count\u,如果,c++,g++,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,

我试图将一个匿名结构传递给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>&)’
函数“void fail()”中的
:
Test.cpp:34:24:错误:调用“count_if(std::map::iterator,std::map::iterator,fail()::&)”时没有匹配的函数
如果将结构设置为命名结构,则会出现类似的错误。我不明白为什么在函数外部声明它与在函数内部声明它会有区别。我错过了什么

#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);
}
#包括
#包括
typedef std::map;
无效失败()
{
结构{
布尔运算符()(映射::值\类型常量和值)
{
返回值.second>0;
}
}检查器;
地图;
std::count_if(map.begin(),
map.end(),
检查者);
}
结构检查器{
布尔运算符()(映射::值\类型常量和值)
{
返回值.second>0;
}
};
无效通行证()
{
地图;
检查者;
std::count_if(map.begin(),
map.end(),
检查者);
}

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

使用
-std=c++11
标志编译


既然使用了C++11,为什么不简单地为
std::count\u使用lambda函数呢?如果

根据C++03规范,不允许使用本地类型作为模板参数。通过C++的2011次修订,解除了这种限制。
限制的基本原因是担心为本地类型创建唯一的名称。然而,已经开发出了一些技术来创建适用于所有系统的唯一名称。

IIRC这在C++03中是不允许的,但在C++11中是允许的。因此,您可以尝试使用C++11编译器进行编译。当然,在C++11中,您也可以使用lambda。“This”-使用本地类型作为模板参数。我说过我没有使用C++11或C++03。我希望我们可以改用它,但这个项目很难改变。