[英]std::map::const_iterator template compilation error
我有一個模板類,其中包含一個std::map
,它存儲指向T的指針,而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;
};
gcc給我以下錯誤:
error: type 'std::map<int, T*, std::less<int>, std::allocator<std::pair<const int, T*> > >' is not derived from type 'Foo<T>'
同樣,以下內容也拒絕編譯:
typedef std::map<int, T*>::const_iterator ItemIterator;
但是,使用不包含模板類型的地圖也可以,例如:
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;
};
我認為這與模板有關,並提出了一個問題-如何將const_iterator
返回到地圖?
使用typename
:
typename std::map<int, T*>::const_iterator begin() const ...
當編譯器第一次傳遞它時,它不知道T
是什么。 因此,它也不知道const_iterator
是否實際上是一種類型。
此類依賴名稱 (取決於模板參數)假定為
typename
template
。 您需要輸入typename
:
typename std::map<int, T*>::const_iterator begin() const { return items.begin(); }
你需要:
typename std::map<int, T*>::const_iterator begin() const { return items.begin(); }
或更簡單
typedef typename std::map<int, T*>::const_iterator const_iterator;
const_iterator begin() const { return items.begin(); }
這是因為const_iterator
是T
依賴名稱,因此您需要告訴編譯器它實際上是類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.