在c++中调用错误的模板函数原型问题
Calling wrong template function prototype problem in c++
我目前正在制作我的自定义矢量容器,以便更好地理解真正的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_type
和value_type
(可能不是int(
您应该使用SFINAE
来限制与InputIterator
概念匹配的类型的第二个,因此只考虑第一个。
int main() {
ft::vector<int> my;
my.insert(my.begin(), 5u, 6); <-- it calls the first prototype.
return (0);
}
相关文章:
- 函数如何通知用户它基于函数原型抛出异常?
- 在函数中拥有函数原型的目的是什么?
- 什么..(省略号)作为函数原型中唯一的函数参数,C++?
- 是否可以使用 libclang python 解析 cpp 文件中没有标头的函数原型
- 有没有办法在C++编译时更改函数原型?
- 省略函数原型中的返回类型
- 如何使用 "using" 关键字定义函数原型/签名
- 函数原型未初始化的局部变量
- 如何创建函数原型命名空间
- 标准库头文件函数原型的实现是如何用 c++ 编写的?
- 为什么这种类型的函数原型会引发错误?
- 函数指针类型不能用于函数原型
- 了解此函数原型
- 将字符串向量传递给函数和函数原型问题 c++
- 函数原型范围的有趣用法
- 为什么这不起作用(C++函数原型)
- 将数组传递到函数会在函数原型声明中出现错误
- 在头文件中的函数原型中获取指针数组:函数声明为 void
- 类/成员函数中的函数原型
- 函数原型中的字符串初始化