저는이 문제를 며칠 동안 알아 내려고 노력해 왔으며 모든 것을 아래 코드로 스트라이프 한 후에 알아 냈습니다 . 아래 코드에서 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;
}
따라서 기본 클래스는 로컬 정의 클래스보다 범위가 가깝다고 간주됩니다. 나는 C2976 에러가 std :: iterator를 참조하는 것을 보았을 때 그럴 수도 있다고 생각했지만 원래의 에러 C2440에 혼란 스러웠다. 어쨌든 감사합니다! – Jacob