0

我一直试图弄清楚这个问题好几天了,最后在将所有东西都分解成下面的代码之后, 。您可以在以下三种不同的尝试代码为在一个为const_iterator构造看,与我得到他们两个人的错误一起。在我看来,编译器正在尝试使用,而不是局部声明雷::迭代器的std ::迭代器。它应该是这样吗?为什么Visual Studio使用std :: iterator <>而不是mine :: iterator <>

已给出线索其他花絮:

  • 如果我的名字我的:迭代别的东西,像我这样的:: B,然后const_iterator(const B &rhs)作品。

  • 如果我从不是的std ::迭代器等一类,然后const_iterator(const iterator<T> &rhs)作品派生的const_iterator。

感谢您的任何信息。下面的代码:

的所有“ 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的易用性。例如,而不是说迭代器使用雷::迭代器。

另外你的第二点给出了你的问题的答案。 “如果我得到的const_iterator从比的std ::迭代器等一类,然后const_iterator(const iterator<T> &rhs)的作品。”

这里最近的迭代器属于std而不是mine,因为std::iterator是您的const_iterator的基类。

+0

所以一个基类被认为范围比本地定义的类更接近。我有点认为可能是这样的情况后,我得到错误C2976引用std :: iterator,但由原始错误C2440如此困惑。不管怎样,谢谢! – Jacob

相关问题