在c++中调用错误的模板函数原型问题

Calling wrong template function prototype problem in c++

本文关键字:函数 原型 问题 c++ 调用 错误      更新时间:2024-04-29

我目前正在制作我的自定义矢量容器,以便更好地理解真正的STL容器。我面临着"插入"功能的问题。

这是我的向量容器中"插入"的两个原型。

// 1
template <typename T, typename Alloc>
void vector<T, Alloc>::insert(iterator position, size_type n, const value_type &val)
// 2
template <typename T, typename Alloc>
template <class InputIterator>
void vector<T, Alloc>::insert(iterator position, InputIterator first, InputIterator last)

当我尝试在main.cpp中使用插入函数时,如下所示,

int main() {
ft::vector<int> my;
my.insert(my.begin(), 5, 6); <-- it calls second proto.
return (0);
}

我本打算调用第一个原型,但它调用了第二个,用于迭代器参数。。。你能解释一下为什么会发生这种情况以及如何解决吗?

您需要使用一些SFINAE来将InputIterator重载限制为迭代器类型。

假设迭代器遵循iterator_traits和/或具有类似iterator_category的嵌套类型,则可以通过SFINAE:检查其存在性

template <class Iter>
using iter_cat_t = typename iterator_traits<Iter>::iterator_category;
template <class T, class = void>
constexpr bool is_iterator_v = false;
template <class T>
constexpr bool is_iterator_v<T, std::void_t<iter_cat_t<T>>> = true;
template <typename T, typename Alloc>
template <class InputIterator, std::enable_if_t<is_iterator_v<InputIterator>, int> = 0>
void vector<T, Alloc>::insert(iterator position, InputIterator first, InputIterator last)

行:

my.insert(my.begin(), 5, 6); <-- it calls second proto.

将推导出CCD_ 4到CCD_。相反,第一个函数必须将int转换为size_typevalue_type(可能不是int(

您应该使用SFINAE来限制与InputIterator概念匹配的类型的第二个,因此只考虑第一个。

int main() {
ft::vector<int> my;
my.insert(my.begin(), 5u, 6); <-- it calls the first prototype.
return (0);
}