簡體   English   中英

使用 STL 的部分模板特化

[英]Partial template specialization using STL

我有一個 function 模板 class object 作為參數。 它使用用戶定義的模板 class object 作為參數可以正常工作,但它使用 std::array object 給出了錯誤。 如果我試圖執行這個程序

#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>但 class Template<T1,size>適合匹配Template<int, 3>

因為第二個模板參數的std::array類型是std::size_t ,但不是int 它們不匹配並導致對非類型模板參數的模板參數推導失敗。

(強調我的)

如果在形參列表中使用了非類型模板形參,並且推導了相應的模板實參,則推導的模板實參的類型(在其封閉的模板形參列表中指定,意味着保留引用)必須與非類型模板參數完全,除了 cv 限定符被刪除,並且模板參數是從數組綁定中推導出來的——在這種情況下,任何整數類型都是允許的,即使 bool 總是會變為真:

將類型更改為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 << " ";
}

居住

你很親密。 使用 size_t 而不是 int。 這編譯:

#include <iostream>
#include <array>

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

template<size_t 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM