2013-10-03 4 views
2

Мой конструктор принимает std::array. Я пытаюсь дать ему значение по умолчанию, но вызов конструктора без аргументов дает эту ошибку:Как использовать аргумент по умолчанию для 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 

У меня что-то не так?

+3

Почему не ставят перегрузку 'Позиция :: Положение()'? – deepmax

+0

Это невозможно сделать, [Передача массива в качестве параметра со значениями по умолчанию в int main()] (http://stackoverflow.com/questions/4894094/passing-an-array-as-a-parameter-with-default -values-in-int-main) – cpp

+1

@cpp он не пытается это сделать. Он хочет значение по умолчанию для аргумента * конструктора *, а не основного. – Adam

ответ

4

Вы должны повторить тип:

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

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

+0

Эти копии не оптимизированы компилятором? поскольку на месте вызова компилятор знает, был ли предоставлен аргумент по умолчанию или нет. – TemplateRex

+1

@TemplateRex Если реализация метода заканчивается в другой единицы перевода, компилятор не имеет возможности оптимизировать его. (может быть, может быть, LTO может прийти на помощь, но я никогда не буду опираться на него) –

+0

OK, но для заголовков STL (с их скрытыми распределителями, а что нет) и другого кода только для заголовков эта проблема не применяется, правильно? – TemplateRex

2

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

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