C++ std::map::const_迭代器模板编译错误

C++ std::map::const_迭代器模板编译错误,c++,templates,C++,Templates,我有一个模板类,它包含一个std::map,该类存储指向拒绝编译的T的指针: template <class T> class Foo { public: // The following line won't compile std::map<int, T*>::const_iterator begin() const { return items.begin(); } private: std::map<int, T*> items; };

我有一个模板类,它包含一个
std::map
,该类存储指向拒绝编译的T的指针:

template <class T>
class Foo
{
public:
  // The following line won't compile
  std::map<int, T*>::const_iterator begin() const { return items.begin(); }

private:
  std::map<int, T*> items;
};
模板
福班
{
公众:
//以下行将不会编译
std::map::const_迭代器begin()const{return items.begin();}
私人:
地图项目;
};
gcc给了我以下错误:

error: type 'std::map<int, T*, std::less<int>, std::allocator<std::pair<const int, T*> > >' is not derived from type 'Foo<T>'
错误:类型“std::map”不是从类型“Foo”派生的
同样,以下文件也拒绝编译:

template <class T>
class Foo
{
public:
  // The following line won't compile
  std::map<int, T*>::const_iterator begin() const { return items.begin(); }

private:
  std::map<int, T*> items;
};
typedef std::map::const_iterator itemator

但是,使用不包含模板类型的映射可以正常工作,例如:

template <class T>
class Foo
{
public:
  // This is OK
  std::map<int, std::string>::const_iterator begin() const { return items.begin(); }

private:
  std::map<int, std::string> items;
};
模板
福班
{
公众:
//这没关系
std::map::const_迭代器begin()const{return items.begin();}
私人:
地图项目;
};

我假设这与模板有关,并提出了一个问题-如何将常量迭代器返回到我的映射?

使用
typename

typename std::map<int, T*>::const_iterator begin() const ...
typename std::map<int, T*>::const_iterator begin() const { return items.begin(); }
typename std::map::const\u迭代器begin()const。。。
当编译器第一次传递时,它不知道
t
是什么。因此,它也不知道const_迭代器是否是一个类型

此类依赖名称(依赖于模板参数)假定为

  • 除非前缀为
    typename
  • 除非直接以
    template
    作为前缀,否则不能作为模板

您需要
typename

typename std::map<int, T*>::const_iterator begin() const ...
typename std::map<int, T*>::const_iterator begin() const { return items.begin(); }
typename std::map::const_迭代器begin()const{return items.begin();}
您需要:

typename std::map<int, T*>::const_iterator begin() const { return items.begin(); }
typename std::map::const_迭代器begin()const{return items.begin();}
或者更简单

typedef typename std::map<int, T*>::const_iterator const_iterator;
const_iterator begin() const { return items.begin(); }
typedef typename std::map::const_iterator const_iterator;
常量迭代器begin()常量{return items.begin();}

这是因为
常量迭代器
的名称依赖于
T
,所以您需要告诉编译器它实际上是类型。

+1以确保完整性。幸运的是,
模板
并没有像以前那样频繁地出现。确认!我试过typename,但放错地方了。谢谢你,乔治。