2016-08-04 52 views
4

我有類Array限定內部類const_iterator內部類方法定義

template <class T, int SIZE = 100> 
class Array 
{ 
    // my class here 
public: 
    class const_iterator 
    { 
    // my class here 
    }; 


    void insert(const_iterator position, int value); 
}; 


template <class T, int SIZE /*= 100*/> 
void Array<T, SIZE>::insert(const_iterator position, int value) 
{ 
    // impl 
} 

是正常,該類別的該外我已經定義的功能和作爲第一個參數已經使用const_iterator position鍵入而不是寫入typename Array<T, SIZE>::const_iterator position?這是否符合標準?如果在Array類別之外還有另一個const_iterator類別,該怎麼辦?

+1

與您似乎暗示的不同,這與模板無關,同樣的規則適用於非模板類。 – Holt

回答

4

是的,這是完全正常和標準(當然,在類中,你需要讓你的insert()成員函數採取類型的參數之前聲明const_iterator第一)。

對於類之外的成員函數定義,首先在該類的範圍內查找類名稱範圍introducer之後的每個名稱。因此,如果有另一個const_iteratorArray,我們仍然會先找到內一個因爲那是我們開始尋找的範圍請注意,這只是那些名字後級引入具有此特殊查詢:

// this is okay 
template <class T, int SIZE> 
typename Array<T, SIZE>::const_iterator Array<T, SIZE>::some_method() { ... } 

// error: this does *not* find the nested const_iterator class 
template <class T, int SIZE> 
const_iterator Array<T, SIZE>::some_method() { ... } 

// this is okay. trailing return type comes after the class introducer 
template <class T, int SIZE> 
auto Array<T, SIZE>::some_method() 
    -> const_iterator 
{ ... } 
+0

將編輯的問題修改爲正確的問題。謝謝! :) –