在std :: map中插入typedef的问题

时间:2017-12-17 12:14:05

标签: c++

我在一个简单的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);
        }        
}

1 个答案:

答案 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方法重载。

DEMO

除此之外,请考虑将 typedef 更改为类型别名

using Generation_data_block = std::vector<uint8_t>;
// ...

因为它是从 C ++ 11 开始做事的首选方式。