在派生的构造函数初始化列表中初始化模板

时间:2016-04-08 18:52:59

标签: c++ templates constructor initializer-list

Foo继承std::array<int, 2>。是否可以在Foo的构造函数的初始化列表中填充数组?

如果是,那么什么是以下语法的有效替代?

// Foo is always an array of 2 ints
struct Foo: std::array<int, 2>
{
    Foo() {}
    Foo(const int & x, const int & y) : std::array<int, 2> { x, y } {}
}

我尝试添加一对额外的大括号,它们适用于g ++,但不适用于VC2015编译器:

#include <array>
#include <iostream>

struct Foo : std::array<int, 2>
{
    Foo() {}
    Foo(const int & x, const int & y) : std::array<int, 2> {{ x, y }} {}
};

int main()
{
    Foo foo(5, 12);

    std::cout << foo[0] << std::endl;
    std::cout << foo[1] << std::endl;

    system("PAUSE");
}

并收到以下错误:https://i.gyazo.com/4dcbb68d619085461ef814a01b8c7d02.png

1 个答案:

答案 0 :(得分:2)

是的,你只需要额外的一对括号:

struct Foo: std::array<int, 2> {
    Foo() {}
    Foo(const int & x, const int & y) : std::array<int, 2> {{ x, y }} {}
                                                           ^        ^
};

Live Demo

对于VC ++编译器,您需要一对括号而不是大括号:

struct Foo : std::array<int, 2> {
    Foo() {}
    Foo(const int & x, const int & y) : std::array<int, 2>({ x, y }) {}
                                                          ^        ^
};