2017-02-07 4 views
1

수정 I 효과적으로 컴파일러는 A::A의 어떤 인스턴스가 인수 목록과 일치하지 불평 멤버 이니셜 라이저 목록

#include <vector> 
class A { 
    std::vector<int> m_sizes; 
public: 
    A(std::initializer_list<int> const& sizes) : m_sizes(sizes) {} 
}; 

class B { 
    A m_a; 
public: 
    B(int size_front, int size_back, std::initializer_list<int> const& sizes) : m_a({ size_front, sizes, size_back }) {} 
}; 

에 줄 몇 가지 코드가 있습니다. 을 std::initializer_list<int>에 평평하게하는 방법이 있습니까? 아니면이 상황을 처리하기 위해 A 여분의 생성자를 제공해야합니까? A 클래스를 수정할 수 없으면 어떻게해야합니까?

+2

앞에'표준 : initializer_list'은 수정할 수 없습니다. 이 템플릿은 주로 컴파일러가 사용하기위한 템플릿입니다. 새로운'std :: initializer_list'를 초기화하는 유일한 방법은 기본 생성자를 사용하거나, 빈리스트를 생성하거나, 상수를 사용하는 것입니다. 이 경우,'A'는'vector' 매개 변수를 취하는 다른 생성자를 필요로하고 그것을 사용하여'm_sizes'를 초기화합니다; 그 생성자를 사용할 수 있습니다. 'A' 클래스를 수정할 수 없다면 아무 것도 할 수 없습니다. C++은 그런 식으로 작동하지 않습니다. –

답변

2

당신이하려는 것은 불가능합니다. 의 항목 목록에서 initializer_list<T>을 컴파일해야합니다.이 항목의 수는 컴파일 타임에 알려져 있습니다. 중간에 기존 목록을 삽입해도 작동하지 않습니다.

당신은 직접 vector<int>를 사용하는 생성자 오버로드를 추가하고 그것에 호출을 전달하여이 문제를 해결할 수 있습니다

class A { 
    std::vector<int> m_sizes; 
public: 
    A(const std::vector<int>& sizes) : m_sizes(sizes) {} 
    A(std::initializer_list<int> const& sizes) : A(std::vector(sizes)) {} 
}; 
class B { 
    A m_a; 
    std::vector<int> frame(int size_front, int size_back, std::initializer_list<int> const& sizes) { 
     std::vector res; 
     res.push_back(size_front); 
     std::copy(sizes.begin(), sizes.end(), std::back_inserter(res)); 
     res.push_back(size_back); 
     return res; 
    } 
public: 
    B(int size_front, int size_back, std::initializer_list<int> const& sizes) : m_a(frame(size_front, size_back, sizes)) {} 
}; 
+0

Hmmn .... 필자는 복사 - 붙여 넣기 실수를 냄 ...? 멤버 함수'B :: frame()'의 매개 변수 유형 순서를 확인하고 * member-initialization-list에서 전달한 내용 *'B'의 생성자 – WhiZTiM

+0

@WhiZTiM 당신은 정말 옳습니다, 정말 고마워요! – dasblinkenlight

관련 문제