我试图将一个匿名结构传递给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);
}
答案 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