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,但放错地方了。谢谢你,乔治。