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

时间:2015-08-21 22:25:10

标签: c++ dictionary iterator

=“ “

我定义了新类型:

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

然后我做了班级成员:

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;
}

我收到了这个错误:

  

错误:从&#39; std :: map转换,   std :: pair&amp;,cv :: Mat&amp;)&gt; &GT;   :: const_iterator {aka std :: _ Rb_tree_const_iterator,std :: pair&amp;,cv :: Mat&amp;)&gt; &GT; &GT;}&#39;到非标量类型   &#39; std :: map,std :: pair&amp;,cv :: Mat&amp;)&gt; &gt; :: iterator {aka   的std :: _ Rb_tree_iterator,   std :: pair&amp;,cv :: Mat&amp;)&gt; &GT; &GT;}&#39;   要求            map&gt; :: iterator it = functions.begin();

2 个答案:

答案 0 :(得分:4)

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

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

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

auto it = functions.cbegin();

答案 1 :(得分:2)

再次查看输出:

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是一个常量成员函数,因此它可以将类成员视为常量。

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

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