C++ 17 컴파일러를 사용하는 경우 여분의 중괄호 세트가 누락됩니다. compiles 다음 : 골재
thing<int> t1 { { { {1,2}, {3,4} } } };
// | | | |- braces for inner array
// | | |--- braces for outer array
// | |----- braces for base sub object of thing
// |------- braces for list initialization of thing
C++ 17 modified 규칙은 그들이 public
및 virtual
비를있는 한, 기본 클래스를 허용합니다. §11.6.1/1 [dcl.init.aggr]
집합체 가입일
배열 또는
(1.1) 없음 사용자 제공 explicit
, 또는 상속 생성자 ([class.ctor),
가지는 클래스 (인 1.2) 비공개 또는 보호 된 비 정적 데이터 멤버 ([class.access]),
(1.3) 가상 함수 없음,
(1.4) 가상, 개인 또는 보호 된 기본 클래스 ([class.mi])가 없습니다.
기본 클래스는 지금 elements of the aggregate을 고려하고 있으며, 자체 목록 초기화를 사용하여 초기화 할 수 있습니다.
소자 집합의은 :
배열 용 (2.1) , 배열 증가 첨자 위해 요소 또는 클래스
(2.2) 선언에서 직접 기본 클래스 선언 된 순서대로 익명 공용체의 멤버가 아닌 직접적인 비 정적 데이터 멤버 ([class.mem])가 뒤 따른다.
std::array
집계이며, 보강-초기화 목록을 사용하여 수행 초기화 집계입니다 :
C++ (14), 및 이전, 대답의 버전은 다음과 초기화. 그러나 기본 클래스가 있으므로 thing
은 집계가 아닙니다.
§8.5.1/1 [dcl.init.AGGR]
집합체 배열 없거나 사용자 제공 생성자와 클래스 (9 절) (12.1)없이 비 정적 개인 또는 보호 된 데이터 부재 (11.)에 없이 기지 클래스 (10 절) 및 가상 기능 없음 (10.3).
따라서 집계 초기화가 작동하지 않습니다. 당신이하려고하는지에 따라, 당신은 std::array<std::array<T, 2>, 2>
인수를 thing
위한 생성자를 제공하고, 초기화 기본 하위 개체
template<typename T>
struct thing : std::array<std::array<T, 2>, 2>
{
thing(std::array<std::array<T, 2>, 2> arr)
: std::array<std::array<T, 2>, 2>(arr)
{}
};
thing<int> t{ {{ {{1,2}}, {{3,4}} }} };
또는 thing
는 데이터 구성원으로 std::array
를 포함 갖고 싶어 하나. 지금 thing
은 여전히 집계입니다.
무엇을 당신이 시도하고하는 것은,
thing
는
array<array<T,2>,2>
의 별칭 수있는 다음 위 중 하나를 필요로하지 않는 경우
template<typename T>
struct thing
{
std::array<std::array<T, 2>, 2> arr;
};
thing<int> t{ {{ {{1,2}}, {{3,4}} }} };
. 사용
template<typename T>
using thing = std::array<std::array<T, 2>, 2>;
thing<int> t{{ {{1,2}}, {{3,4}} }};
왜 2D 배열에서 상속하려고합니까? – rashmatash
배열의 앨리어싱을 시도하는 경우, template = "std :: array, 2>를 사용하여 템플릿 을 사용하는 것이 더 낫습니다. –
Quentin