2016-09-26 3 views
2

я столкнулся с этой функцией подписиWeird спецификация шаблона

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 
    } 
}; 
Смежные вопросы