C++ 推导模板函数中的数组大小,传递值与传递引用之差
为什么它不能为传递值计算出C++ 推导模板函数中的数组大小,传递值与传递引用之差,c++,templates,C++,Templates,为什么它不能为传递值计算出\u size,而能够为传递引用1计算出呢?在log\u seq\u pbv中,您试图让模板自动推断C样式数组x的大小,并在每种情况下定义不同的函数。这是行不通的,因为C样式数组不知道自己的大小。您需要将数组的大小作为实际参数传递给函数 在log\u seq\u pbr中,语法T(&x)[\u size]是一种非常特殊的语法,专门用于声明对已知大小数组的引用(有关更多详细信息)。这是使用C样式数组执行本文尝试的操作的唯一方法,因为它为编译器提供了选择正确模板参数所需的信
\u size
,而能够为传递引用1计算出呢?在log\u seq\u pbv
中,您试图让模板自动推断C样式数组x
的大小,并在每种情况下定义不同的函数。这是行不通的,因为C样式数组不知道自己的大小。您需要将数组的大小作为实际参数传递给函数
在log\u seq\u pbr
中,语法T(&x)[\u size]
是一种非常特殊的语法,专门用于声明对已知大小数组的引用(有关更多详细信息)。这是使用C样式数组执行本文尝试的操作的唯一方法,因为它为编译器提供了选择正确模板参数所需的信息
但是,在这里使用C++更好,因为那个容器的整个点是它自己知道数组大小的数组。下面是一个例子:
#包括
#包括
使用名称空间std;
模板
无效打印元素(常量数组和a)
{
对于(大小i=0;icout模板是一个麻烦事,不能按值传递数组。请注意错误消息中log\u seq\u pbv()
的签名:void log\u seq\u pbv(const T*)
。在函数参数中,const T x[\u size]
只是const T x[]
的语法糖(忽略\u size
),这反过来又只是const T*x
的糖。传递一个简单的指针,任何大小信息都会丢失,因此无法推导\u size
模板参数。如果需要这样做,请改用std::array
。
#include <iostream>
/* prints sequentially the elements of an array */
template<typename T, unsigned int _size>
void log_seq_pbr(const T (&x)[_size]){
for(unsigned int i = 0; i < _size ; i++){
std::cout << i << " " << x[i] << std::endl;
}
return;
}
/* prints sequentially the elements of an array */
template<typename T, unsigned int _size>
void log_seq_pbv(const T x[_size]){
for(unsigned int i = 0; i < _size ; i++){
std::cout << i << " " << x[i] << std::endl;
}
return;
}
int main(int argc, char const *argv[])
{
int arr[10] = {0};
log_seq_pbr(arr);
log_seq_pbv(arr);
return 0;
}
tmp.cpp: In function 'int main(int, const char**)':
tmp.cpp:33:20: error: no matching function for call to 'log_seq_pbv(int [10])'
33 | log_seq_pbv(arr);
| ^
tmp.cpp:17:6: note: candidate: 'template<class T, unsigned
int _size> void log_seq_pbv(const T*)'
17 | void log_seq_pbv(const T x[_size]){
| ^~~~~~~~~~~
tmp.cpp:17:6: note: template argument deduction/substitution failed:
tmp.cpp:33:20: note: couldn't deduce template parameter '_size'
33 | log_seq_pbv(arr);