2014-07-21 2 views
-1
struct B { 
    int b; 
    B(int i = 0) : b(i) {}; // constructor 
}; 

struct D : B { 
    int d; 
}; 

int main() { 
    D obj = {1}; // <-- error 
    // D obj {1}; // <-- error (different) 

} 

하지 컴파일을 수행하고 있습니다 :C++ (11) 통일 초기화 코드 위

error: could not convert ‘{1}’ from ‘<brace-enclosed initializer list>’ to ‘D’ 

같은 내가 제거 경우에도 마찬가지입니다 "생성자"라인. 내가 = 기호를 제거하면 , 즉 D obj {1}; 그런 다음 아래 제공 :

error: no matching function for call to ‘D::D(<brace-enclosed initializer list>)’ 

이러한 문제를 해결하기위한 올바른 구문은 무엇입니까?

+0

당신이'B' 기본-구성하고'1'과'd'를 초기화에 그것을 기대하고있다 : 당신이 할 수있는 일은 같은 D에 해당 생성자를 제공하는 것입니다? 또는 'B'를 '1'로 초기화하고 'd'를 초기화하지 않은 상태로 유지 하시겠습니까? 어느 쪽이든, 모호성을 해결하려면 생성자가 필요합니다 (또는 기본 구성 - 원하는대로 멤버를 설정). 중괄호 초기화는 일치하는 생성자가있는 집계 또는 클래스에서만 작동합니다. –

+0

@MikeSeymour, 우리가 ** struct B에서 "생성자"행을 지우더라도 ** 오류가 남아 있습니다. – iammilind

+0

물론 그렇습니다. 내가 말했듯이 "중괄호 초기화는 일치하는 생성자가있는 집계 또는 클래스에만 적용됩니다." 'D'에게 적절한 생성자를 주거나, 생성자를 디폴트로 구성하고 생성 후에 멤버를 설정해야합니다. –

답변

7

D에는 int을 취하는 생성자가 없습니다. 당신이 B의 생성자를 상속하려면, 다음과 같이, 그렇게 말 :

struct D : B { 
    using B::B; 
    int d; 
}; 

당신은 아마 D 다른 int 멤버가 주어진하지만 그것보다 더 많은 일을하고 싶다. B::b (B::B를 호출하여) 모두 초기화합니다 및 D::d 아마 다음과 같을 것이다 D

더 완벽한 :

struct D : B { 
    D(int d_) : B(d_), d(d_) {} 
    int d; 
}; 

어느 쪽이든, 당신의 코드는 Dint을 복용 생성자가 말을 할 필요가있다. 단지 기본 생성자를 가지고 B::B(int i)를 호출하는 방법을 알고하지 않습니다 당신이 D을 작성한에서 http://goo.gl/YbSSHn

+0

'struct B'에서 "생성자"행을 제거하더라도 오류가 남아 있습니다. – iammilind

+0

[아니오, 그렇지 않습니까?] (http://coliru.stacked-crooked.com/a/f1e944a81d88407a) –

+0

@iammilind. 무슨 뜻인지 모르겠군요. 나는 잘 컴파일 된 작업 예제에 링크했다. 당신은 아직도 깨진 생각을 보여줄 수 있습니까? –

1

: 코드 내 조각 등을 사용하여 작업에

연결합니다.

struct D : B { 
    D(int i) : B(i) {}//; 
    int d; 
}; 
+1

iammilind의 중복 세미콜론을 전파했습니다! 나는 아무 말도하지 않을 것이지만, 그것은 지금 당신들 중 두 명입니다. – TonyK

+0

감사합니다. 나는 세미콜론을 언급 할 것이다. –

+1

그 해결책은 나에게 일어나지 않았을 것이다! – TonyK