簡體   English   中英

std :: map :: const_iterator模板編譯錯誤

[英]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的直接前綴,否則不要成為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_iteratorT依賴名稱,因此您需要告訴編譯器它實際上是類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM