2012-12-26 165 views
2

所以我有我的模板類的一些問題。C++類嵌套到模板類

<!-- language: lang-c++ --> 

template<class T> 
class List { 
    class Counter 
    {  
    T real; 
    T imaginary; 
    Counter *next; 
//.... 
    public: 
    Counter(T a=0,T b=0);     
    virtual ~Counter();      
    friend ostream& operator<<(ostream&,Counter&); 
    friend ostream& operator<<(ostream&,List&); 
    }; 
    Counter* first; 
    Counter* last; 
//.... 
}; 

但我有一些方法的問題。如果我寫的功能

template<class T> Counter operator/(Counter &one,...) 

當我在VC++ 10看櫃檯它說,像

<error_type>&one 

例如。我應該在代碼中的任何地方使用template<class T>作爲我的Counter類嗎?

//Methods 
//Counter. For example some methods 
Counter operator/(Counter& one,Counter& two){} 
ostream& operator<<(ostream&os,Counter&x){} 
istream& operator>>(istream&is,Counter&x){} 
//List 
template<class T>void List<T>::add(Counter *T,int i,bool c){} 
+0

是的,你應該。除非您定義函數內聯,否則您需要爲每個方法定義提供模板參數。 – atoMerz

+0

據我所知,是的,如果你需要在計數器中使用模板類。 – swtdrgn

回答

2

這取決於你是否定義了運營商(無論他們是否是成員函數或全球運營商)類定義或之外的它

如果你這樣做的類定義中,沒有必要爲template<T>,也不是爲List<T>

template <typename T> 
class List 
{ 
public: 
    class Counter 
    { 
    /* This is a global operator* defined inside the class, and 
     as friend. */ 
    friend Counter operator*(const Counter &c1, const Counter &c2) 
    { 
     return Counter(); 
    } 
    }; 

}; 

(請注意,我的operator*定義實際上不是有用,因爲它總是返回一個空Counter這只是爲了演示語法。)

但是,如果您在類之外定義運算符(因此也在List的模板定義之外),則必須使用函數模板定義的完整語法:

template <typename T> 
typename List<T>::Counter operator/(const typename List<T>::Counter &c1, const typename List<T>::Counter &c2) 
{ 
    return List<T>::Counter(); 
} 

正如你所看到的,這包括三個步驟:

  1. template <....>,所有模板參數的定義之前封閉在< ... >名稱。
  2. 使用List<T>::Counter以指示Counter是一個嵌套類型名
  3. 使用typename List<T>::Counter因爲Counter嵌套成依賴型(即依賴於模板參數類型)。
+0

所以據我所知 template typename List ::計數器*列表 :: Node_find(int i) 對我的編譯器沒有錯誤嗎? – Jamakase

+0

恩,是嗎?這對我來說似乎是正確的,但如果仍然存在錯誤,請告訴我。 – jogojapan