2016-09-26 72 views
2

我已經運行到這個函數簽名怪異模板規範

template<typename T> 
template<typename FI> 
void vector<T>::_M_assign_aux (FI first, FI last,std::forward_iterator_tag) 
{} 

是否等同於這一個?

template<typename T, typename FI> 
void vector<T>::_M_assign_aux (FI first, FI last,std::forward_iterator_tag) 
{} 

是否有任何理由單獨編寫它?

回答

4

_M_assign_aux貌似vector<T>的方法,所以這應該已經開始用這樣的代碼:

template<typename T> 
class vector 
{ 
    // ... 

    template<typename FI> 
    void _M_assign_aux(FI first, FI last,std::forward_iterator_tag); 

    // ... 
}; 

尋找類的聲明,解釋更「看得見」:你有一個模板聲明的類,還有一個用於該方法。

template<typename T> // template declaration for vector 
template<typename FI> // template declaration for _M_assign_aux 
void vector<T>::_M_assign_aux(FI first, FI last,std::forward_iterator_tag) 
{ 
} 
+0

是啊,這是從實際vector.tcc。還有一個關於g ++的問題。 stl_vector.h和vector.tcc有什麼區別? –

+0

@JiříLechner.tcc通常用作模板類實現的擴展。 –

2

實際上,這是一個類模板的方法模板。因此,第一個template <typename T>適用於vector<T>(類模板)。然後,template <typename FI>適用於方法_M_assign_aux()

如果將聚集在一個獨特的地方,整個事情就應該是這樣的:

template <typename T> 
class vector { 
    // Some stuff 
    template <typename FI> 
    void _M_assign_aux(FI first, FI last, std::forward_iterator_tag) { 
     // Some impl 
    } 
};