- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经实现了 forward_list
的一个子集并想测试方法 assign(size_type __n, const _Tp& __val)
但是我得到了一个编译器错误,因为编译器想要改为调用方法 assign(_InputIterator __first, _InputIterator __last)
。
我写了下面的片段,只是为了说明问题:
测试.h
#ifndef TEST_H
#define TEST_H
#include <utility> // Just to get the std::size_t
template<typename _Tp>
class forward_list {
public:
typedef std::size_t size_type;
void assign(size_type n, const _Tp& val)
{
printf("%s\n", __PRETTY_FUNCTION__);
}
template<typename _InputIterator>
void assign(_InputIterator first, _InputIterator last)
{
printf("%s\n", __PRETTY_FUNCTION__);
}
};
#endif // TEST_H
测试.cpp
#include <stdlib.h>
#include <stdio.h>
#include "test.h"
int main()
{
forward_list<int> l;
l.assign(10, 5);
return 0;
}
执行的输出是:
void forward_list<_Tp>::assign(_InputIterator, _InputIterator) [with _InputIterator = int; _Tp = int]
我想调用方法 assign(size_type __n, const _Tp& __val)
。
编译器版本(以防万一):g++ (Debian 4.7.2-5) 4.7.2
我使用了与 std::forward_list
中使用的签名相似的签名,并且使用以下代码片段(使用 STL):
std::forward_list<int> l;
l.assign(10, 5);
编译器知道它必须调用 assign(size_type __n, const _Tp& __val)
并且不会混淆。我错过了什么?
最佳答案
当您调用 l.assign(10, 5);
时,有两个可行的重载:
void assign(size_type n, const int& val)
template <>
void assign(int first, int last)
当我们说非模板函数优于模板函数时,只有当两者具有无法区分的转换序列时,这才是正确的。但在这种情况下,函数模板将完全匹配(您的两个参数都是int
,无需转换),而非模板将必须进行提升(必须提升10
从 int
到 size_t
)。所以这就是函数模板重载是首选的原因。
至于如何修复它,您只需要使模板不是 成为可行的重载。这涉及为输入迭代器编写一个 type_trait,使用 void_t
并不难:
template <typename... >
using void_t = void;
template <typename T, typename = void>
struct is_input_iterator : std::false_type { };
template <typename T>
struct is_input_iterator<T, void_t<
decltype(std::declval<T>() == std::declval<T>()),
decltype(std::declval<T>() != std::declval<T>()),
decltype(*std::declval<T>()),
decltype(++std::declval<T>()),
decltype(std::declval<T>()++)
>> : std::true_type { };
然后要求is_input_iterator
:
template <typename _InputIterator,
typename = std::enable_if_t<is_input_iterator<_InputIterator>::value>>
void assign(_InputIterator first, _InputIterator last);
还有很多其他方法可以做这种事情,我只是碰巧喜欢 void_t
。无论采用哪种方式,您都必须确保模板根本不可行。
关于c++ - forward_list : assign(_InputIterator __first, _InputIterator __last)/assign(size_type __n, const _Tp& __val),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30809075/
#include #include #include #include using namespace std; int main() { int i = 0; auto p = ma
在基于类的情况下使用 atomic 时出现编译问题。 错误:使用已删除的函数‘std::atomic::atomic() [with _Tp = node]’ 堆() { ^ /usr/include
代码 A: vector::const_reverse_iterator rcit; vector::const_reverse_iterator tit=v.rend(); for(rcit = v
我无法理解 .at 是什么意思在 openCV 中表示。 最佳答案 at是 Mat 的一种方法返回对指定元素的引用的类。尖括号内的参数是矩阵的元素类型。 例如要将 int 类型的矩阵 H 中位置 (1
我在 cpp 中得到了这段代码(这是我收到错误的最小示例): #include #include #include #include const int N = 128; template
我有一个类,看起来像这样: template using VectorPtr=std::vector>; template using VectorRawPtr=std
我专门针对数据类型使用“少”(谓词)。 代码如下所示: template<> struct std::less { bool operator()(const DateTimeKey& k1,
对 std::set 的所有元素执行 xor 时出现一些错误。下面是部分代码。不太了解 std::transform。请帮忙 :) #include #define ll long l
我已经实现了 forward_list 的一个子集并想测试方法 assign(size_type __n, const _Tp& __val) 但是我得到了一个编译器错误,因为编译器想要改为调用方法
我已经实现了 forward_list 的一个子集并想测试方法 assign(size_type __n, const _Tp& __val) 但是我得到了一个编译器错误,因为编译器想要改为调用方法
在我们开始之前,我完全是 C++11 的菜鸟,几年前就用过 C。 我正在尝试使用 pybind11 编写 C++11 代码的 python 绑定(bind),但出现了subjected 错误。我基本上
我无法将元素插入 vector 。 void Addvec(const vector &v) { int num{}; cout>num; v.push_back(num);
我是一名优秀的程序员,十分优秀!