首页 文章

从std :: map <std :: basic_string <char>转换,std :: pair <int,int(*)(const std :: vector :: Mat

提问于
浏览
1

我已经定义了新类型:

typedef int(* func) (const std::vector<cv::Mat>&, cv::Mat&);

然后我做了 class 成员:

std::map< std::string, std::pair<int,func> > functions;

在功能上,在第一行:

pair<funcId,func> functionSet::getRandomFunction() const
{
    map<string, pair<int,func>>::iterator it = functions.begin();
    std::advance(it, functions.size());

    string name = it->first;
    func function = it->second.second;
    int argumentsNumber = it->second.first;
    funcId id = make_pair(argumentsNumber,name);

    pair<funcId,func> p = make_pair(id,function);

    return p;
}

我收到了这个错误:

错误:从'std :: map,std :: pair&,cv :: Mat&)>> :: const_iterator {aka std :: _ Rb_tree_const_iterator,std :: pair&,cv :: Mat&)>>>}转换为非-scalar类型'std :: map,std :: pair&,cv :: Mat&)>> :: iterator {aka std :: _ Rb_tree_iterator,std :: pair&,cv :: Mat&)>>>}''request map>: :iterator it = functions.begin();

2 回答

  • 4

    您的方法标记为const,因此 this 的类型为 const functionSet* . 改变你的第一行:

    map<string, pair<int,func>>::const_iterator it = functions.begin();
    

    或者如果您的编译器支持C 11标准:

    auto it = functions.cbegin();
    
  • 1

    再看一下输出:

    conversion from
    'std::map, std::pair&, cv::Mat&)> >::const_iterator {...}'
    to non-scalar type
    'std::map, std::pair&, cv::Mat&)> >::iterator {...}'
    

    所以似乎 functions 是一个const映射,它的 begin() 返回一个const迭代器,它不能转换成普通的迭代器 .

    它是常量的原因是因为 getRandomFunction 是一个常量成员函数,因此它可以将类成员视为常量 .

    由于您不修改 Map ,只需使用 const_iterator 即可解决问题:

    map<string, pair<int,func>>::const_iterator it = functions.begin();
    

相关问题