QuickSilver
QuickSilver

Reputation: 53

Unable to create 2D vector in CPP std::vector<std::vector<uint8_t>> by just giving the size

I was creating empty 2D vector in a header file by just providing size but unable to create it.

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

    };

I am getting below error

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));
      |                                                                                 ^`

Can anyone please help to fix this issue.

Upvotes: 2

Views: 552

Answers (3)

Vlad from Moscow
Vlad from Moscow

Reputation: 311068

This initialization

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

of a class data member is incorrect. The compiler considers such a declaration as a declaration of a member function.

You may use brace or equal initialization. For example

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

};

That is enclose the initializer in braces instead of parentheses.

Upvotes: 2

tugrul
tugrul

Reputation: 165

You have used two different integer types uint8_t and int.

You should change it as

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

As A Class Member To initialize the vector as a class member that is also dependent on other class members you can use the class constructor. The following code worked for me.

#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)) {}
};

Upvotes: 2

WalleyM
WalleyM

Reputation: 172

You're trying to create a vector of vectors of uint8_t. Then you are constructing that vector with a vector of type int where it is expecting a vector of type uint_8, hence the no matching function error message.

Either change your vector to be a vector of vectors of int:

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

Or change your construction argument to be a vector of type uint8_t:

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

Upvotes: 2

Related Questions