2015-01-24 7 views
4

나는 뭔가를 놓치고 정확히 무엇을 모르겠다 고 생각합니다. 코드 스 니펫을 살펴 보겠습니다. 초기화에서 유형을 변환 할 수 없습니다.

template <typename T> 
struct Foo { 
    Foo (int n, int p, string s, T t = {}) 
    : m_n {n}, m_p {p}, m_s {s}, m_t {t} 
    {} 

    const int m_n; 
    const int m_p; 
    const string m_s; 
    T m_t; 
}; 

그리고 사용

은 다음과 같습니다

Foo<int> f_int1 {1, 2, "A", 155}; 
Foo<int> f_int2 {1, 2, "A"}; 

모든 의도처럼. 그러나 Foo의 T 매개 변수로 사용자 정의 유형을 원할 때 일부 오류가 발생합니다. 고려 :

struct Boo { 
    int z; 
    int l; 
}; 

그리고 사용 :

Foo<Boo> f_boo1 {1, 2, "A"}; 
Foo<Boo> f_boo2 {1, 2, "A", {1, 2}}; 

이 모두 명령 줄 (GCC 4.8.1) :

cannot convert ‘Boo’ to ‘int’ in initialization 
이 같은 우우 개체를 만들 수 있습니다

:

Boo boo1 {}; 
Boo boo2 {1, 2}; 

그래서, 당신은 나에게 t 그는 문제가 무엇입니까?

가능한 해결 방법 :

struct Boo { 
    Boo() : z {}, l {} {} 
    Boo (int p1, int p2) : z {p1}, l {p2} {} 

    int z; 
    int l; 
}; 

그리고 지시 아래 모두가 의도 한대로 작동 :

나를 위해
Foo<Boo> f_boo1 {1, 2, "A"}; 
Foo<Boo> f_boo2 {1, 2, "A", {1, 2}}; 

, 그 괜찮아, 나는 두 개의 생성자를 추가 할 수없는 어떤 이유가 표시되지 않습니다 그런데 타입이 내 것이 아니라면? 생성자와 함께 간단한 래퍼를 작성해야합니까? 당신이 Boo에 집계 초기화를 수행하기 위해 노력하고 있기 때문이다

감사합니다, 아르투르

+0

[관련] (http://stackoverflow.com/questions/21340801/uniform-initialization-fails-to-copy-when-object-has-no-data : 그냥 목록 초기화를 사용하지 않는 -members) 오류 –

답변

6

. §8.5.4/3 참조 :

List-initialization of an object or reference of type T is defined as follows:

— If T is an aggregate, aggregate initialization is performed (8.5.1).

을 따라서, 당신은 당신의 Boo을-구성 복사하려는거야 ...하지만 정말 당신이 Boo에서 int z를 구성하려고로 연결 집계 초기화를하고있는 당신이 훨씬 적은 코드 및 템플릿없이 문제를 재현 할 수있는 오류

error: no viable conversion from 'Boo' to 'int'

참고 :

Boo b; 
Boo b2{b}; // error 

수정 간단합니다.

template <typename T> 
struct Foo { 
    Foo (int n, int p, string s, T t = {}) 
    : m_n {n}, m_p {p}, m_s {s}, m_t(t) 
    //       ^^^^^^ 
{}; 
+0

에 대한 동일한 이유는 집계 초기화를 사용하여 ctor로 전달되는 대신'{1,2}'가 암시 적으로'Boo'로 변환 된 이유를 분명히 알 수 있습니까? 'Foo '이 집합체가 아닌가? – vsoftco

+0

@vsoftco'Boo {1,2}'*는 집계 초기화를 수행합니다. 'Boo {anything, at, all}'는'Boo'가 집계이기 때문에 집계 초기화가 될 것입니다. – Barry

+0

@vsoftco'Foo '은 사용자 제공 생성자가 있기 때문에 집계가 아닙니다. 전체 정의 (8.5.1) : "집계는 사용자 제공 생성자가 없거나 비공개 또는 비 정적 데이터 멤버가없고 기본 클래스가없고 가상 함수가없는 배열 또는 클래스입니다." – Barry

관련 문제