Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 怪异的模板规范_C++_Templates - Fatal编程技术网

C++ 怪异的模板规范

C++ 怪异的模板规范,c++,templates,C++,Templates,我遇到了这个函数签名 template<typename T> template<typename FI> void vector<T>::_M_assign_aux (FI first, FI last,std::forward_iterator_tag) {} 模板 模板 void vector::_M_assign_aux(FI first,FI last,std::forward_iterator_标记) {} 它和这个相等吗 template&l

我遇到了这个函数签名

template<typename T>
template<typename FI>
void vector<T>::_M_assign_aux (FI first, FI last,std::forward_iterator_tag)
{}
模板
模板
void vector::_M_assign_aux(FI first,FI last,std::forward_iterator_标记)
{}
它和这个相等吗

template<typename T, typename FI>
void vector<T>::_M_assign_aux (FI first, FI last,std::forward_iterator_tag)
{}
模板
void vector::_M_assign_aux(FI first,FI last,std::forward_iterator_标记)
{}

有任何理由单独编写吗?

\u M\u assign\u aux
看起来像是一种
向量的方法,因此应该从如下代码开始:

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

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

    // ...
};
template <typename T>
class vector {
    // Some stuff
    template <typename FI>
    void _M_assign_aux(FI first, FI last, std::forward_iterator_tag) {
        // Some impl
    }
};
模板
类向量
{
// ...
模板
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)
{
}
template//向量的模板声明
模板//用于_M_assign_aux的模板声明
void vector::_M_assign_aux(FI first,FI last,std::forward_iterator_标记)
{
}

实际上,这是类模板的方法模板。因此,第一个
模板
适用于
向量
(类模板)。然后,
模板
应用于方法
\u M\u assign\u aux()

如果你将整个东西收集到一个独特的地方,它会是这样的:

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

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

    // ...
};
template <typename T>
class vector {
    // Some stuff
    template <typename FI>
    void _M_assign_aux(FI first, FI last, std::forward_iterator_tag) {
        // Some impl
    }
};
模板
类向量{
//一些东西
模板
void\u M\u assign\u aux(FI first,FI last,std::forward\u iterator\u标记){
//一些简单的
}
};

是的,这实际上是vector.tcc提供的。还有一个关于g++的问题。stl_vector.h和vector.tcc的区别是什么?@JiříLechner.tcc通常用作模板类实现的扩展。