C++ 将本地结构传递给count\u,如果
我试图将一个匿名结构传递给std::count_if,它无法编译 当我尝试编译时(使用g++4.5.3,不使用c++03或c++11扩展),我在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,
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。我希望我们可以改用它,但这个项目很难改变。