如何使用std :: array的默认参数? "数组必须使用括号括起的初始化程序初始化"

时间:2013-10-03 06:25:19

标签: c++ c++11 constructor default-value stdarray

我的构造函数需要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 个答案:

答案 0 :(得分:5)

您需要重复以下类型:

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

当这个(或使用双括号)工作时,它会在默认情况下在每个调用方的侧面创建一个副本。重载的构造函数会避免这种代码膨胀,因此我建议优先选择重载而不是默认参数。

答案 1 :(得分:4)

第二个案例运行所需的双括号:

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