簡體   English   中英

C ++:“預期;”在模板中的聲明中

[英]C++: “expected ;” in declaration in template

我在模板化類的成員函數中遇到了以下問題:

#include <map>
using std::map;
template <typename A,typename B>
class C {
  public:
    B f(const A&,const B&) const;
  private:
    map<A,B> D;
};
template <typename A,typename B>
B C<A,B>::f(const A&a,const B&b) const {
   map<A,B>::const_iterator x = D.find(a);
   if(x == D.end())
     return b;
   else
     return x->second;
}

當我有g ++編譯時,我收到以下錯誤:

Bug.C: In member function 'B C<A,B>::f(const A&, const B&) const':
Bug.C:12: error:expected ';' before 'x'
Bug.C:13: error: 'x' was not declared in this scope

但是,當我創建類和函數的非模板化版本時,A和B都是int,它編譯沒有問題。 這個錯誤有點神秘,因為我無法想象為什么它想要一個';' 在'x'之前。

你錯過了一個typename

typename map<A,B>::const_iterator x = D.find(a);

請閱讀“我在哪里以及為什么要放置”模板“和”typename“關鍵字? 你在這里需要typename的原因是因為AB是模板參數,這意味着::const_iterator的含義取決於 AB是什么。 對於人類而言,名稱const_iterator明顯表明這是一個迭代器類型,對於編譯器而言,它不知道這是一個類型,數據成員等。

編譯器將在模板實例化之前對第一遍進行語法檢查,並通過添加typename讓編譯器知道將map<A,B>::const_iterator解析為類型。

此外,C ++中有一個特殊規則(從鏈接問題中可恥地竊取):

假定模板聲明或定義中使用的名稱以及依賴於模板參數的名稱不會命名類型,除非適用的名稱查找找到類型名稱或名稱由關鍵字typename限定。

如果不添加typename ,編譯器必須假定它不是類型

您錯過了關鍵字typename ,這在引用類型的限定名稱之前是必需的,並且取決於模板參數:

typename map<A,B>::const_iterator x = D.find(a);

你必須添加typename

typename map<A,B>::const_iterator x = D.find(a);

說明:
typename聲明應將typename的名稱視為類型。 否則,名稱將被解釋為引用非類型。

暫無
暫無

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

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