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>)’
이러한 문제를 해결하기위한 올바른 구문은 무엇입니까?
당신이'B' 기본-구성하고'1'과'd'를 초기화에 그것을 기대하고있다 : 당신이 할 수있는 일은 같은
D
에 해당 생성자를 제공하는 것입니다? 또는 'B'를 '1'로 초기화하고 'd'를 초기화하지 않은 상태로 유지 하시겠습니까? 어느 쪽이든, 모호성을 해결하려면 생성자가 필요합니다 (또는 기본 구성 - 원하는대로 멤버를 설정). 중괄호 초기화는 일치하는 생성자가있는 집계 또는 클래스에서만 작동합니다. –@MikeSeymour, 우리가 ** struct B에서 "생성자"행을 지우더라도 ** 오류가 남아 있습니다. – iammilind
물론 그렇습니다. 내가 말했듯이 "중괄호 초기화는 일치하는 생성자가있는 집계 또는 클래스에만 적용됩니다." 'D'에게 적절한 생성자를 주거나, 생성자를 디폴트로 구성하고 생성 후에 멤버를 설정해야합니다. –