2016-04-08 5 views
0

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 } {} 
} 

Я попытался добавить дополнительную пару скобок, которая работает на г ++, но не на 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

Почему 'Foo' наследует от' станд :: array'? –

+0

В моем приложении это будет класс point/vector с функциями GetX() SetY() и т. Д. Для меня это имеет больше смысла, чем структура с элементами данных x, y, z, поскольку это позволяет мне удалять повторяющийся код для каждого измерения , –

+1

Это, безусловно, зависит от вас, как вы разрабатываете вещи. Но я скажу, что наследование не лучший инструмент для большинства заданий (http://blog.codinghorror.com/inherits-nothing/, и, в отличие от C#, большая часть стандартной библиотеки C++ не предназначена для наследования с). Хотя вы можете наследовать от 'std :: array', обратите внимание, что у него нет функций' virtual', что означает, что вы почти никогда не будете взаимодействовать с вашим 'Foo' с помощью указателя или ссылки std :: array'; но это нормально, потому что деструктор 'std :: array' не является виртуальным, поэтому вам нужно знать, что у вас действительно есть« Foo », когда вы уничтожаете свой объект. –

ответ

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 }) {} 
                 ^ ^
}; 
+0

К сожалению, это не сработает; см. мой отредактированный вопрос. EDIT: В VS2015 –

+0

Спасибо! Ваше последнее редактирование прекрасно работает. Маркировка как решена. –

Смежные вопросы