2014-07-25 3 views
5

나는 형 물건의 객체를 초기화하기 위해 노력하고있어 :std :: array <std :: array <T, 2>, 2>의 객체를 초기화하는 방법은 무엇입니까?

template<typename T> 
    struct thing : std::array<std::array<T, 2>, 2> 
    { 
    }; 

thing<int> t1 {{ {1,2}, {3,4} }}; 

내가 얻을 :

error: no matching function for call to ‘thing<int>::thing(<brace-enclosed initializer list>)’ 
thing<int> t1 {{{1,2},{3,4}}}; 

동감을

thing<int> t0{{ 1, 2, 3, 4 }}; 

및 여러 다른 것들로.

+3

왜 2D 배열에서 상속하려고합니까? – rashmatash

+2

배열의 앨리어싱을 시도하는 경우, template = "std :: array , 2>를 사용하여 템플릿 을 사용하는 것이 더 낫습니다. – Quentin

답변

9

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 규칙은 그들이 publicvirtual 비를있는 한, 기본 클래스를 허용합니다. §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은 여전히 ​​집계입니다.

무엇을 당신이 시도하고하는 것은, thingarray<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}} }}; 
관련 문제