#include <iostream>
using namespace std;
template<class T>
void fill(T *arr,int size){
for(int i = 0; i < size; i ++){
cout<<"Insert value " << i << " :" ;
cin >> arr[i];
}
}
int main(){
int option,size;
cout << "Size? ";
cin >> size;
cout << "1 = double" << endl
<< "2 = int" << endl;
cin >> option;
if(option == 1){
double arr[size];
}
else if(option == 2){
int arr[size];
}
fill(arr,size);
return 0;
}
但是当我尝试运行它时,我收到了这个错误
test.cpp:在函数'int main()'中:test.cpp:24:7:错误:'arr'是 未在此范围内声明填充(arr,size); ^
答案 0 :(得分:2)
在main()
中,您的arr
变量仅在声明它们的if()
块的范围内。当if
关闭}
时,它们会超出范围。所以他们确实不在调用fill()
的范围内。
无论如何它并不重要,因为无论如何你都不能声明一个具有多种类型的变量。因此,您无法在arr
的范围内声明单个fill()
数组变量,并且根据用户的数组类型为int
或double
输入(好吧,除非你使用std::variant
或std::any
,但这是它自己的主题。)
您需要在数组在范围内的fill()
块内调用if()
。
此外,您依赖于非标准特定于供应商的扩展,称为&#34;可变长度数组&#34;,也就是在自动(堆栈)内存中分配可变大小的数组动态(堆)内存。只有一些编译器将该扩展实现为额外功能。不要依赖它。分配可变大小数组的正确方法是使用new[]
代替std::vector
或更好Array.prototype.reduce。
尝试更像这样的事情:
#include <iostream>
#include <vector>
template<class T>
void fill(T *arr, int size){
for(int i = 0; i < size; i ++){
std::cout << "Insert value " << i << " :";
std::cin >> arr[i];
}
}
int main(){
int option, size;
std::cout << "Size? ";
std::cin >> size;
std::cout << "1 = double" << std::endl
<< "2 = int" << std::endl;
std::cin >> option;
if (option == 1) {
std::vector<double> arr(size);
fill(&arr[0], size);
}
else if (option == 2) {
std::vector<int> arr(size);
fill(&arr[0], size);
}
return 0;
}