使用STL的部分模板专业化

拉夫尚

我有一个具有模板类对象作为参数的函数。它可以很好地与用户定义的模板类对象作为参数一起工作,但可以给std :: array对象提供错误。如果我尝试执行此程序

#include<iostream>
#include<array>

template<typename T1, int size>
void print(std::array<T1, size> &arr)
{
    for (auto ele : arr)
        std::cout << ele << " ";
}

template<int size>
void print(std::array<float, size> &arr)
{
    std::cout << "its float" << std::endl;
    for (auto ele : arr)
        std::cout << ele << " ";
}

int main()
{
    std::array<int, 3> arr{1,3,4};
    std::array<float, 2> ar2{1.3, 3.4};
    print(arr);
    print(ar2);
    return 0;
}

并得到这个错误

error: no matching function for call to ‘print(std::array<int, 3>&)’
     print(arr);

但是,当我运行此程序时,它就可以正常工作。

#include<iostream>
#include<array>

template<class T, int size>
class Template
{
    public:
    std::array<T, size> arr;
};

template<typename T1, int size>
void print(Template<T1, size> &obj)
{
    for (auto ele : obj.arr)
        std::cout << ele << " ";
}

template<int size>
void print(Template<float, size> &obj)
{
    for (auto ele : obj.arr)
        std::cout << ele << " ";
}

int main()
{
    Template<int, 3> array;
    array.arr[0] = 1;
    array.arr[1] = 2;
    array.arr[2] = 3;
    Template<float, 2> arr2;
    arr2.arr[0] = 2.3;
    arr2.arr[1] = 2.9;
    print(array);
    print(arr2);
    return 0;
}

我不明白为什么std::array<T1, size>不适合参加比赛,std::array<int, 3>但班级Template<T1,size>适合参加比赛Template<int, 3>

songyuanyao

因为第二个模板参数的类型std::arraystd::size_t,但不是int它们不匹配,并导致非类型模板参数上的模板参数推导失败。

(强调我的)

如果在参数列表中使用了非类型模板参数,并且推导了相应的模板参数,则推导的模板参数的类型(如其随附的模板参数列表中指定的那样,意味着保留引用)必须与完全是非类型模板参数,除了cv-qualifiers被删除,以及从数组绑定推导出template参数的情况外,在这种情况下,允许任何整数类型,即使bool始终会变为true:

将类型更改为std::size_t

template<typename T1, std::size_t size>
void print(std::array<T1, size> &arr)
{
    for (auto ele : arr)
        std::cout << ele << " ";
}

template<std::size_t size>
void print(std::array<float, size> &arr)
{
    std::cout << "its float" << std::endl;
    for (auto ele : arr)
        std::cout << ele << " ";
}

生活

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有STL容器的部分C ++模板专业化

来自分类Dev

部分模板专业化

来自分类Dev

C ++部分模板模板专业化

来自分类Dev

部分模板模板矢量专业化

来自分类Dev

使用模板专业化

来自分类Dev

部分专业化:使用主要模板成员

来自分类Dev

部分模板专业化的麻烦

来自分类Dev

如何选择部分模板专业化?

来自分类Dev

了解模板部分专业化

来自分类Dev

C ++部分模板专业化混淆

来自分类Dev

模板类部分专业化语法

来自分类Dev

别名模板的部分专业化

来自分类Dev

部分模板专业化和icc

来自分类Dev

部分模板成员专业化

来自分类Dev

这是部分模板专业化吗?

来自分类Dev

C ++部分模板专业化问题

来自分类Dev

C ++模板部分专业化

来自分类Dev

std :: hash模板部分专业化

来自分类Dev

C ++部分模板专业化混淆

来自分类Dev

模板类部分专业化语法

来自分类Dev

基于部分模板-模板的专业化与显式部分模板的专业化

来自分类Dev

部分模板参数应用无法使用的部分模板专业化GCC 4.8.1

来自分类Dev

模板模板部分专业化失败:“预期的类模板”

来自分类Dev

在专业化之前使用模板吗?

来自分类Dev

STL容器的迭代器的模板专业化?

来自分类Dev

模板类(如std :: function)的部分模板专业化

来自分类Dev

模板模板的部分专业化的正确语法是什么

来自分类Dev

模板类方法的部分专业化或实例化

来自分类Dev

如何基于作为STL容器的模板参数模拟所选成员函数的部分专业化?