gpt4 book ai didi

c++ - 类模板构造函数重载解析歧义

转载 作者:行者123 更新时间:2023-11-30 04:42:40 25 4
gpt4 key购买 nike

我在写一个类似STL vector的类模板,两个构造函数是这样的:

template<class T>
vector<T>::vector(size_t count, const T&value) :bg(new T[count]),
ed(bg + count), cap(ed) {
for (auto it = bg; it != ed; ++it)
*it = value;
}//bg ed cap are all T*

template<class T>
template<class Input>
vector<T>::vector(Input first, Input second) : bg(new T[second - first]),
ed(bg + (second - first)), cap(ed) {
memcpy(bg, (void*)first, sizeof(T)*(second - first));
}

如果我这样做

vector<int>v(2,0)

complier 给我错误,程序似乎使用了第二个构造函数而不是第一个。谁能解释为什么? STL vector 表示

This overload only participates in overload resolution if InputIt satisfies LegacyInputIterator, to avoid ambiguity with the overload (3).

那么我该如何更改我的代码来避免这种情况呢?提前致谢。

最佳答案

选择第二个重载是因为它在 Input 时更好地匹配参数类型是int .具体来说,给定参数 (int, int) , 过载 (int, int)是比重载更好的匹配 (size_t, int const&) .请注意,如果您将第一个重载的第一个参数从 size_t 更改为至 int , 它将被选中。

如果想在Input时禁用函数模板重载是一个输入迭代器,你可以利用SFINAE使用 std::enable_if :

template <
typename InputIt,
typename = std::enable_if_t<
std::is_base_of_v<
std::input_iterator_tag,
typename std::iterator_traits<InputIt>::iterator_category>>>
vector(InputIt, InputIt)
{
}

您可以选择将逻辑提取到类型特征中。

template <typename T, typename = void>
struct is_input_iterator : std::false_type
{
};

template <typename T>
struct is_input_iterator<T, std::void_t<typename std::iterator_traits<T>::iterator_category>>
: std::is_base_of<
std::input_iterator_tag,
typename std::iterator_traits<T>::iterator_category>
{
};

template <typename T>
constexpr bool is_input_iterator_v = is_input_iterator<T>::value;

然后函数定义变得更具可读性。

template <
typename InputIt,
typename = std::enable_if_t<is_input_iterator_v<InputIt>>>
vector(InputIt, InputIt)
{
}

关于c++ - 类模板构造函数重载解析歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58646533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com