2017-05-06 6 views
3

http://www.cplusplus.com/reference/vector/vector/vector/을 참조하는 벡터 컨테이너를 구현하려고합니다. 몇 가지 문제를 일으키는 두 가지 생성자가 있습니다.C++ 벡터 생성자 인스턴스 생성 충돌

template <typename T> 
vector (size_type n, const T& val); 

template <typename T> 
template <typename InputIterator> 
vector (InputIterator first, InputIterator last); 

vector<int> vec(100, 1);을 사용할 때. 두 템플릿 생성자가 인스턴스화를 수행하는 것 같습니다. 그래서 나는 T = inttemplate <typename T> template <typename InputIterator> vector (InputIterator first, InputIterator last)T = int, InputIterator = int으로 을 얻었습니다.

어떻게 해결할 수 있습니까?

+3

두 템플릿 생성자가 인스턴스화를한다는 것은 무엇을 의미합니까? –

+0

또한 갈등이있는 것을 어떻게 알 수 있습니까? 어떤 오류 메시지가 나타 납니까? C++ 11 이전에 [mcve] – UnholySheep

답변

4

표준 (C++ 11 이후)에서는 인수가 반복자로 작동 할 때 과부하 해결에만 참여하는 오버로드 된 constructor of std::vector에 매개 변수로 iterator를 사용해야합니다.

이 과부하는 InputIt이 InputIterator을 충족하는 경우에만 과부하 해결에 참여하여 overload (2)와의 모호성을 방지합니다.

SFINAEstd::iterator_traits을 사용하면 벡터를 직접 구현할 수 있습니다. 예 : InputIterator = int의 경우를 들어

template <typename InputIterator, typename = typename std::iterator_traits<InputIterator>::value_type> 
vector (InputIterator first, InputIterator last) { ... } 

, std::iterator_traits<int>는 과부하가 오버로드 확인에서 배제 할 것, value_type 같은 구성원 유형을 포함하지 않습니다.


BTW : 좀 더 정확하게 말하면, 문제는 "두 템플릿 생성자 모두 인스턴스화"가 아닙니다. 어떤 유형의 다른 사람이 size_type 일지 모르겠다면 std::size_t과 같이 vector<int> vec(100, 1);과 같이 1 번째 인수를 int에서 std::size_t으로 변환해야하므로 1 차 오버로드가 선택되지 않습니다. 두 번째 오버로드는 InputIterator = int과 완벽한 일치 인스턴스 생성을 생성 할 수 있으므로 선택됩니다. 그것은 우리가 기대하는 행동이 아닙니다.

+0

... 표준을 제공하면 인수가 정수형 인 경우 'vector (InputIter, InputIter)'가 다른 오버로드와 같이 작동해야합니다. – aschepler