0

저는이 문제를 며칠 동안 알아 내려고 노력해 왔으며 모든 것을 아래 코드로 스트라이프 한 후에 알아 냈습니다 . 아래 코드에서 const_iterator의 생성자에서 세 가지 시도를 볼 수 있으며 그 중 두 가지에 대한 오류도 볼 수 있습니다. 컴파일러가 로컬로 선언 된 mine :: iterator 대신 std :: iterator를 사용하려고합니다. 그런 식으로되어 있니? 단서를 준Visual Studio에서 mine :: iterator <> 대신 <: iterator <>를 사용하는 이유는 무엇입니까?

다른 맛있는 가벼운 음식 :

  • 난 내 이름을 경우 :: 내 :: B, 다음 const_iterator(const B &rhs) 작품 같은 다른 반복자 것을.

  • std :: iterator 이외의 클래스에서 const_iterator를 파생하면 const_iterator(const iterator<T> &rhs)이 작동합니다.

감사합니다. 여기에 코드입니다 : 모든 'using namespace'의

#include "stdafx.h" 
#include <iterator> 

namespace mine 
{ 

    template <class T> 
    class iterator : public std::iterator<std::random_access_iterator_tag, T, ptrdiff_t, T*, T&> 
    { 
    public: 
     iterator() {} 
    }; 

    template <class T> 
    class const_iterator : public std::iterator<std::random_access_iterator_tag, T, ptrdiff_t, const T*, const T&> 
    { 
    public: 
     const_iterator() {} 
     const_iterator(const mine::iterator<T> &rhs) {} // works 
     //const_iterator(const iterator &rhs)  {} // error C2440: initializing: cannot convert from 'mine::iterator<T>' to 'mine::const_iterator<T>' 
     //const_iterator(const iterator<T> &rhs)  {} // error C2976: std::iterator: too few template arguments 
    }; 

}// namespace mine 

using namespace mine; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    iterator<int> y; 
    const_iterator<int> x = y; 

    return 0; 
} 

답변

0

먼저 사용의 용이성을 위해 typedef를 사용, 악이다. 예를 들어 iterator 대신 mine :: iterator를 사용하면된다.

또한 두 번째 요점은 질문의 답을 제공합니다. "std :: iterator 이외의 클래스에서 const_iterator 파생 된 경우 const_iterator(const iterator<T> &rhs) 작동합니다." std::iteratorconst_iterator의 기본 클래스로

여기에 가장 가까운 반복자는, std하지 mine에 속한다.

+0

따라서 기본 클래스는 로컬 정의 클래스보다 범위가 가깝다고 간주됩니다. 나는 C2976 에러가 std :: iterator를 참조하는 것을 보았을 때 그럴 수도 있다고 생각했지만 원래의 에러 C2440에 혼란 스러웠다. 어쨌든 감사합니다! – Jacob

관련 문제