我试图使用本地类作为函子并使用g ++(3.4.6)获得编译器错误.
将下面的class(Processor)放在全局范围内可以解决错误,所以我猜错误是因为函数本地结构/类.我更喜欢在函数内部使用类,以实现代码清晰度和易用性.想知道是否有解决方法使下面的代码有效.
test.cpp:24:错误:没有匹配函数来调用\ u2018foreachArg(int&,char*&,processSubs(int,char*):: Processor&)\ u2019
template <class Functor>
void foreachArg(int n, char *args[], Functor& f)
{
for(int i=0; i<n; ++i)
f(args[i]);
}
int processSubs(int argc, char *args[])
{
class Processor
{
public:
void operator()(const char *arg)
{
}
};
Processor p;
foreachArg(argc, args, p);
}
int main(int argc, char *argv[])
{
processSubs(argc, argv);
}
Run Code Online (Sandbox Code Playgroud) 我有一个简单的程序,它在迭代Map时删除std :: map中的项目.如果我没有错误,则前导迭代器不会因地图中的擦除而失效.但是valgrind会抛出无效的读错误.有人可以解释原因.
#include <map>
#include <iostream>
typedef std::map<std::string, int> SourceMap;
int main(int argc, char *argv[])
{
SourceMap sourceMap;
sourceMap["item1"] = 1;
sourceMap["item2"] = 2;
sourceMap["item3"] = 3;
sourceMap["item4"] = 4;
for(SourceMap::const_iterator it=sourceMap.begin(); it != sourceMap.end(); ++it)
{
sourceMap.erase(it->first);
}
}
Run Code Online (Sandbox Code Playgroud)
Valgrind错误:
==31703== Invalid read of size 8
==31703== at 0x3851069E60: std::_Rb_tree_increment(std::_Rb_tree_node_base*) (in /usr/lib64/libstdc++.so.6.0.13)
==31703== by 0x4013D6: std::_Rb_tree_const_iterator<std::pair<std::string const, int> >::operator++() (stl_tree.h:259)
==31703== by 0x40106B: main (map_iterator.cpp:14)
==31703== Address 0x4c2c0b8 is 24 bytes inside a block of size 48 free'd …Run Code Online (Sandbox Code Playgroud)