Как использовать аргумент по умолчанию для std :: array? & quot; массив должен быть инициализирован инициализатором в скобках & quot;

Мой конструктор занимает std::array, Я пытаюсь дать ему значение по умолчанию, но вызов конструктора без аргумента дает эту ошибку:

$ g++ -std=c++11 -Wall -Werror -Wextra -pedantic-errors test.cpp Position.cpp -o test
test.cpp: In function ‘int main()’:
test.cpp:14:29: error: array must be initialized with a brace-enclosed initializer
Position *y = new Position();
^
test.cpp:14:29: error: too many initializers for ‘std::array<unsigned char, 8ul>’

Номера строк разные. Это мой код:

// test.cpp
int main() {
Position *x = new Position({1,1,1,1,1,1,1,1}); // works
Position *y = new Position(); // does not work
}

// Position.cpp
#include <cstdint>
#include <array>
#include "Position.h"Position::Position( std::array<uint8_t,8> columns_ ) {
columns = columns_;
}

// Position.h
#ifndef POSITION_H
#define POSITION_H
#include <array>
class Position {
public:
Position( std::array<uint8_t,8> = {0,0,0,0,0,0,0,0} );
private:
std::array<uint8_t,8> columns;
};
#endif

Что я не так понял?

2

Решение

Вам нужно повторить тип:

Position( std::array<uint8_t,8> = std::array<uint8_t,8>{0,0,0,0,0,0,0,0} );

хотя это (или использование двойных скобок) работает, при создании значения по умолчанию создается копия на стороне каждого вызывающего абонента. Перегруженный конструктор будет избегать такого рода кодов, поэтому я бы посоветовал предпочесть перегрузку параметрам по умолчанию.

4

Другие решения

двойные скобки, необходимые для запуска второго случая:

Position( std::array<uint8_t,8> = {{0,0,0,0,0,0,0,0}} );
3

По вопросам рекламы [email protected]