类模板构造函数重载解析度歧义

禅西

我正在写一个像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)

编译器给我错误,似乎程序使用第二个构造函数,而不是第一个。谁能解释为什么?的stl矢量说

仅当InputIt满足LegacyInputIterator时,此重载才参与重载解析,以避免与重载(3)产生歧义。

因此,如何更改代码以避免这种情况?提前致谢。

约瑟夫·汤姆森

选择第二个重载是因为它与Inputis类型的参数类型更好地匹配int具体来说,给定参数(int, int),重载(int, int)比重载更好(size_t, int const&)请注意,如果将第一个重载的第一个参数从size_t更改为int,则将选择它。

如果要在Input输入迭代器禁用功能模板重载时,可以使用以下方法利用SFINAEstd::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)
{
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++重载解析度不明确-GCC

来自分类Dev

对重载整数构造函数的歧义调用

来自分类Dev

模板编程:对重载函数的歧义调用

来自分类Dev

@Parcelize 和枚举类 - 重载解析歧义

来自分类Dev

对基类中的重载函数的歧义调用

来自分类Dev

将一组类转换为类模板并避免构造函数歧义

来自分类Dev

低萤幕解析度

来自分类Dev

低萤幕解析度

来自分类Dev

Kotlin:内联lambda和重载解析度不明确

来自分类Dev

C ++模板函数重载解析

来自分类Dev

基类的模板函数重载

来自分类Dev

由于std :: function而在构造函数重载中存在歧义

来自分类Dev

调用重载的构造函数会产生歧义错误C ++

来自分类Dev

由于std :: function而在构造函数重载中存在歧义

来自分类Dev

模板方法类模板的重载解析规则

来自分类Dev

C ++模板和对重载函数的歧义调用

来自分类Dev

C ++模板和对重载函数的歧义调用

来自分类Dev

解析度问题和operator <<对于模板类型的问题-第2部分

来自分类Dev

解决重载函数的歧义

来自分类Dev

重载函数的歧义

来自分类Dev

C ++类模板构造函数-数组(U *)的重载引用(U&)失败

来自分类Dev

模板化的类构造函数在struct中使用错误的重载

来自分类Dev

消除与超类的类字段同名的构造函数参数的歧义

来自分类Dev

泛型构造函数中的重载解析

来自分类Dev

模板类成员与非成员模板函数的歧义

来自分类Dev

复制模板类的构造函数

来自分类Dev

模板类的专门构造函数

来自分类Dev

专攻模板类构造函数

来自分类Dev

专攻模板类构造函数