我在一个简单的std::map
中插入一些typedef有一个奇怪的问题。
我定义了三种类型:
typedef std::vector<uint8_t> Generation_block;
typedef std::vector<Generation_block> Generation_blocks;
typedef std::map<uint32_t, Generation_blocks> Generations_map;
到目前为止没有错误发生。在this中,我有这样的想法,以便在阅读代码时减少混淆。现在,当我想在地图中插入一些值时,情况变得更糟:
Generation_block = gen_block; //gets filled with some uint8_t data
Generation_blocks = gen_blocks; //gets filled with some Generation_block
Generations_map gen_map;
uint32_t generation_id; //gets set to several values identifiying the packet generation (for rlnc network coding purposes)
gen_map.insert(generation_id, gen_blocks); //error occurs
最后一行产生错误:
error: no matching function for call to ‘std::map<unsigned int, std::vector<std::vector<unsigned char> > >::insert(uint32_t&, Generation_blocks&)’
gen_map.insert(gen_id, gen_blocks);
但我真的不明白我在这里做错了什么。有人有建议吗?自己的typedef是否有问题我只是没有意识到the post?
编辑#1:
所以我构建了一个最小的例子:
#include<vector>
#include<cstdint>
#include<map>
#include<random>
typedef std::vector<uint8_t> Generation_data_block;
typedef std::vector<Generation_data_block> Generation_blocks;
typedef std::map<uint32_t, Generation_blocks> Generations_map;
int main(){
Generations_map gen_map;
for(int j=0; j < 10; j++){
Generation_blocks gen_blocks;
for(int i = 0; i < 10; i++){
Generation_block gen_block;
std::generate(gen_block.begin(), gen_block.end(), rand); //generating randm data
gen_blocks-push_back(gen_block);
}
uint32_t generation_id = j;
gen_map.insert(generation_id, gen_blocks);
}
}
答案 0 :(得分:1)
gen_map.insert(generation_id, gen_blocks);
您无法以这种方式将元素插入std::map
。
您需要将代码更改为:
gen_map.insert(std::make_pair(generation_id, gen_blocks));
或者,简单地说:
gen_map.insert({generation_id, gen_blocks});
符合std::map
insert方法重载。
除此之外,请考虑将 typedef 更改为类型别名:
using Generation_data_block = std::vector<uint8_t>;
// ...
因为它是从 C ++ 11 开始做事的首选方式。