Visual studio 为什么VisualStudio使用std::iterator<&燃气轮机;而不是我的::迭代器<&燃气轮机;

Visual studio 为什么VisualStudio使用std::iterator<&燃气轮机;而不是我的::迭代器<&燃气轮机;,visual-studio,compiler-construction,stl,constructor,include,Visual Studio,Compiler Construction,Stl,Constructor,Include,我已经试着解决这个问题好几天了,最后在将所有内容分解到下面的代码之后,我终于解决了这个问题。在下面的代码中,您将看到对const_迭代器的构造函数进行的三次不同尝试,以及其中两次出现的错误。在我看来,编译器试图使用std::iterator而不是本地声明的mine::iterator。应该是这样吗 提供线索的其他花絮: 如果我将mine::iterator命名为其他名称,比如mine::B,那么const_iterator(const B&rhs)可以工作 如果我从std::iterator以

我已经试着解决这个问题好几天了,最后在将所有内容分解到下面的代码之后,我终于解决了这个问题。在下面的代码中,您将看到对const_迭代器的构造函数进行的三次不同尝试,以及其中两次出现的错误。在我看来,编译器试图使用std::iterator而不是本地声明的mine::iterator。应该是这样吗

提供线索的其他花絮:

  • 如果我将mine::iterator命名为其他名称,比如mine::B,那么
    const_iterator(const B&rhs)
    可以工作

  • 如果我从std::iterator以外的类派生const_iterator,那么
    const_iterator(const iterator&rhs)
    可以工作

谢谢你提供的任何信息。代码如下:

#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;
}
#包括“stdafx.h”
#包括
名称空间地雷
{
模板
类迭代器:public std::iterator
{
公众:
迭代器(){}
};   
模板
类常量迭代器:public std::iterator
{
公众:
常量迭代器(){}
const_迭代器(const-mine::iterator&rhs){}//works
//const_iterator(const iterator&rhs){}//错误C2440:初始化:无法从'mine::iterator'转换为'mine::const_iterator'
//const_iterator(const iterator&rhs){}//错误C2976:std::iterator:模板参数太少
}; 
}//名称空间地雷
使用名称空间地雷;
int _tmain(int argc,_TCHAR*argv[]
{
迭代器y;
常量迭代器x=y;
返回0;
}

首先,
使用名称空间是邪恶的,使用
typedef
以便于使用。例如,使用mine::iterator代替iterator

你的第二点也回答了你的问题。“如果我从std::iterator以外的类派生const_iterator,则
const_iterator(const iterator&rhs)
有效。”


这里,最近的迭代器属于
std
而不是
mine
,因为
std::iterator
const\u迭代器的基类

,所以基类的作用域被认为比本地定义的类更近。在我收到引用std::iterator的错误C2976后,我认为可能是这样的,但是被最初的错误C2440弄糊涂了。无论如何,谢谢!