为什么Visual Studio使用std :: iterator<>而不是我的:: iterator<>

时间:2012-10-20 00:04:14

标签: visual-studio compiler-construction stl constructor include

我一直试图找出这个问题已经有几天了,最后在将所有内容删除到下面的代码之后就把它弄清楚了。您将在下面的代码中看到针对const_iterator的构造函数的三次不同尝试,以及我在其中两个上遇到的错误。在我看来,编译器正在尝试使用std :: iterator而不是本地声明的mine :: iterator。它应该是那样的吗?

提供线索的其他花絮:

  • 如果我将mine :: iterator命名为其他内容,例如我的:: B,那么const_iterator(const B &rhs)就可以了。

  • 如果我从std :: iterator以外的类派生const_iterator,那么const_iterator(const iterator<T> &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;
}

1 个答案:

答案 0 :(得分:0)

首先'using namespace'是邪恶的,使用typedef是为了方便使用。例如,而不是说迭代器使用mine :: iterator。

另外,你的第二点给出了你的问题的答案。 “如果我从std :: iterator以外的类派生const_iterator,那么const_iterator(const iterator<T> &rhs)就可以了。”

此处最近的迭代器属于std而非mine,因为std::iteratorconst_iterator的基类。