奇怪的模板规范

时间:2016-09-26 15:18:28

标签: c++ templates

我遇到过这个函数签名

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)
{}

有没有理由单独写它?

2 个答案:

答案 0 :(得分: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)
{
}

答案 1 :(得分: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
    }
};