[英]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.