模板函数与std :: map类型匹配

时间:2018-10-24 05:45:58

标签: c++

我的程序中有四张地图:

std::map< int, SigGen* > id_to_siggen_map;
std::map< int, std::vector< double > > id_to_ticks_map;
std::map< int, std::vector< double > > id_to_samples_map;
std::map< int, QListWidgetItem* > id_to_item_map;

我想编写一个模板函数,给定一个id,它可以从上述任何映射中删除与该id对应的条目,即

int id = 4; //could be any other id number
delete_from_map(id, id_to_siggen_map); //deletes entry corresponding to id 4 from id_to_siggen_map
delete_from_map(id, id_to_ticks_map); //deletes corresponding entry from id_to_siggen_map
delete_from_map(id, id_to_samples_map);
delete_from_map(id, id_to_item_map); 

到目前为止我所拥有的:

template <typename T>
void delete_from_map(int id, std::map< int, T > mymap){
  for (auto it = mymap.begin(); it != mymap.end(); it++){
     if(it->first == id){
        mymap.erase(it);
        break;
     }
  }
}

但是,尝试编译会给我四个映射的每一个带来不确定的参考错误。该错误如下所示:

error: undefined reference to `void DVis::delete_from_map<QListWidgetItem*>(int, std::map<int, QListWidgetItem*, std::less<int>, std::allocator<std::pair<int const, QListWidgetItem*> > >)'

我在这里做什么错了?

2 个答案:

答案 0 :(得分:0)

首先,不需要使用for循环,因为可以在map中直接按值删除元素,其次,在map中进行迭代时删除它不是一个好主意,因为它可能导致迭代器失效(请检查:{ {3}})。 正如OP所指出的,并已由其他人验证,所讨论的代码是正确的,但如果我们使用可变参数模板可能会更好,因为将来您可能会遇到编写自己的分配器等的情况。因此建议您尝试以下版本: / p>

template<typename... Args>
void delete_from_map(int id,std::map<int,Args...>& m)
{
    m.erase(id);
}

答案 1 :(得分:0)

如@ t.niese所指出的那样,问题是由分离函数定义和声明引起的链接错误。一旦将定义移到标题中,程序便会编译并运行。

相关问题