【问题标题】:Unable to create 2D vector in CPP std::vector<std::vector<uint8_t>> by just giving the size无法通过仅给出大小在 CPP std::vector<std::vector<uint8_t>> 中创建二维向量
【发布时间】:2021-10-23 09:14:28
【问题描述】:

我在头文件中创建空的二维向量,只提供大小但无法创建它。

    class Grid
    {
        public:

            int rows = 5/0.05;
            int cols = 6/0.05;

            std::vector<std::vector<uint8_t>> grid(rows, std::vector<uint8_t>(cols, 0));

    };

我遇到了错误

no matching function for call to 'std::vector<std::vector<unsigned char> >::vector(int&, std::vector<int>)'

`error: 'rows' is not a type
   19 |         std::vector<std::vector<uint8_t>> grid(rows, std::vector<uint8_t>(cols, 0));
      |                                                ^~~~
C:\Users\prave\Documents\projects\ExhaustiveSearchScanMatching\occupancy_grid.h:19:79: error: expected ')' before ',' token
   19 |         std::vector<std::vector<uint8_t>> grid(rows, std::vector<uint8_t>(cols, 0));
      |                                                                          ~    ^
      |                                                                               )
C:\Users\prave\Documents\projects\ExhaustiveSearchScanMatching\occupancy_grid.h:19:79: error: expected ')' before ',' token
   19 |         std::vector<std::vector<uint8_t>> grid(rows, std::vector<uint8_t>(cols, 0));
      |                                               ~                               ^
      |                                                                               )
C:\Users\prave\Documents\projects\ExhaustiveSearchScanMatching\occupancy_grid.h:19:81: error: expected unqualified-id before numeric constant
   19 |         std::vector<std::vector<uint8_t>> grid(rows, std::vector<uint8_t>(cols, 0));
      |                                                                                 ^`

谁能帮忙解决这个问题。

【问题讨论】:

    标签: c++ class initialization uint8t 2d-vector


    【解决方案1】:

    您使用了两种不同的整数类型uint8_tint

    你应该把它改成

    std::vector<std::vector<uint8_t>> grid(rows, std::vector<uint8_t>(cols, 0));
    

    作为班级成员 要将向量初始化为也依赖于其他类成员的类成员,您可以使用类构造函数。以下代码对我有用。

    #include <vector>
    #include <cstdint>
    
    class grid {
    public:
        int rows = 5/0.05;
        int cols = 6/0.05;
    
        std::vector<std::vector<uint8_t>> grid_vector;
        grid() : grid_vector(rows, std::vector<uint8_t>(cols, 0)) {}
    };
    

    【讨论】:

    • 做到了,但它说行不是一种类型仅供参考我在头文件class grid { public: int rows = 5/0.05; int cols = 6/0.05; std::vector&lt;std::vector&lt;uint8_t&gt;&gt; grid(rows, std::vector&lt;uint8_t&gt;(cols, 0)); };中尝试了这个
    • @QuickSilver 当您想就地初始化类成员时,情况会发生变化。请检查修改后的解决方案。
    • 谢谢,成功了!不能投票我没有足够的声望
    • @QuickSilver 不用担心!祝你好运。
    【解决方案2】:

    您正在尝试创建一个由 uint8_t 向量组成的向量。然后,您将使用 int 类型的向量构造该向量,而它需要 uint_8 类型的向量,因此没有匹配的函数错误消息。

    要么将您的向量更改为 int 向量的向量:

    std::vector<std::vector<int>> grid(rows, std::vector<int> (cols, 0));
    

    或者将您的构造参数更改为 uint8_t 类型的向量:

    std::vector<std::vector<uint8_t>> grid(rows, std::vector<uint8_t>(cols, 0));
    

    【讨论】:

    • 在两个位置都使用了 uint8_t 但仍然是同样的问题
    【解决方案3】:

    这个初始化

        std::vector<std::vector<uint8_t>> grid(rows, std::vector<uint8_t>(cols, 0));
    

    类数据成员不正确。编译器将这样的声明视为成员函数的声明。

    您可以使用大括号或等号初始化。例如

    class Grid
    {
        public:
    
            int rows = 5/0.05;
            int cols = 6/0.05;
    
            std::vector<std::vector<uint8_t>> grid {rows, std::vector<uint8_t>(cols, 0)};
    
    };
    

    即用大括号而不是括号将初始化器括起来。

    【讨论】:

      猜你喜欢
      • 2021-11-19
      • 2011-10-24
      • 2020-12-09
      • 1970-01-01
      • 2018-07-02
      • 2010-11-12
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多