C++ 无法将参数1从';等级*';至';双[]和#x27; #include <iostream> #include <fstream> #include <string> using namespace std; const int n = 900; class City{ string name; double area; int count, roads; public: City() {} City(string a, double b, int c, int d ) { a=name; b=area; c=count; d=roads;} string getname() {return name;} double getarea() {return area;} int getcount() {return count;} int getroads() {return roads;} friend ostream& operator << (ostream& , City& ); friend istream& operator >> (istream& , City& ); }; ostream& operator << (ostream& out, City& a) { out<<"name "<<a.name<<", area "<<a.area<<", count "<<a.count<< ", roads "<<a.roads<<endl; return out; } istream& operator >> (istream& in, City& a) { in>>a.name>>a.area>>a.count>>a.roads; return in; } void fill(int arr[], int size){ ifstream ifs("cities.txt."); for (int i=0;i<size;i++) ifs>>arr[i]; } void func(City* arr){ ofstream ofs("density.out"); for(int i=0;i<n;i++){ if(arr[i].getcount()/arr[i].getarea()>1000) ofs<<arr[i]; } } int main(){ City* hm; hm = new City[n]; fill(hm, n); func(hm); system ("pause"); return 0; } #包括 #包括 #包括 使用名称空间std; 常数int n=900; 阶级城市{ 字符串名; 双区; 国际计数,道路; 公众: 城市(){} 城市(字符串a,双b,整数c,整数d){a=name;b=area;c=count;d=roads;} 字符串getname(){return name;} double getarea(){return area;} int getcount(){return count;} int getroads(){返回道路;} friend ostream&operator>(istream&City&); }; ostream&operator
C++ 无法将参数1从';等级*';至';双[]和#x27; #include <iostream> #include <fstream> #include <string> using namespace std; const int n = 900; class City{ string name; double area; int count, roads; public: City() {} City(string a, double b, int c, int d ) { a=name; b=area; c=count; d=roads;} string getname() {return name;} double getarea() {return area;} int getcount() {return count;} int getroads() {return roads;} friend ostream& operator << (ostream& , City& ); friend istream& operator >> (istream& , City& ); }; ostream& operator << (ostream& out, City& a) { out<<"name "<<a.name<<", area "<<a.area<<", count "<<a.count<< ", roads "<<a.roads<<endl; return out; } istream& operator >> (istream& in, City& a) { in>>a.name>>a.area>>a.count>>a.roads; return in; } void fill(int arr[], int size){ ifstream ifs("cities.txt."); for (int i=0;i<size;i++) ifs>>arr[i]; } void func(City* arr){ ofstream ofs("density.out"); for(int i=0;i<n;i++){ if(arr[i].getcount()/arr[i].getarea()>1000) ofs<<arr[i]; } } int main(){ City* hm; hm = new City[n]; fill(hm, n); func(hm); system ("pause"); return 0; } #包括 #包括 #包括 使用名称空间std; 常数int n=900; 阶级城市{ 字符串名; 双区; 国际计数,道路; 公众: 城市(){} 城市(字符串a,双b,整数c,整数d){a=name;b=area;c=count;d=roads;} 字符串getname(){return name;} double getarea(){return area;} int getcount(){return count;} int getroads(){返回道路;} friend ostream&operator>(istream&City&); }; ostream&operator,c++,C++,void fill(int-arr[],int-size)表示需要将int数组传递给fill。但是,您正在向它传递一个City的实例,特别是在main中的hm 我假设您正在尝试读取cities.txt中的City描述列表(因此具有适当的流提取/插入运算符)。更改fill的签名以接受指向City对象的指针,以便可以填充City对象的数组,而不是ints void fill(City *arr, int size); 确保在main中传递给fill的参数是一个正确分配的City对象数组,其大小至
void fill(int-arr[],int-size)
表示需要将int
数组传递给fill
。但是,您正在向它传递一个City
的实例,特别是在main中的hm
我假设您正在尝试读取cities.txt
中的City
描述列表(因此具有适当的流提取/插入运算符)。更改fill
的签名以接受指向City
对象的指针,以便可以填充City
对象的数组,而不是int
s
void fill(City *arr, int size);
确保在main中传递给fill
的参数是一个正确分配的City
对象数组,其大小至少为sz
,其中sz
是作为第二个参数传入的。请记住调用delete[]
释放您创建的此数组
更惯用的方法是使用vector
,这样就不必担心内存管理问题。修改后的fill
签名将是:
void fill(std::vector<City>& c); // note we no longer need the second argument
void fill(标准::向量&c);//注意,我们不再需要第二个参数
您需要#包括
,以便能够使用向量
最后,为了利用RVO,只需按值返回向量
,而不是将其作为参数传递。所以,你可以做一些类似的事情:
std::vector<City> fill(); // cleaner, faster
std::vector fill();//更干净,更快
void fill(int arr[],int size)
需要一个int
数组。您正试图向其传递一个City
数组
您可以编写一个新函数,<代码>虚空填充(城市和ARR,int size)< /> >或者您可以考虑编写模板函数,<代码>模板空洞填充(t*ARR,size)< /C> >等
也考虑使用<代码> STD::vector < /COD>或<代码> STD::数组而不是裸数组。边界检查和内存管理将大大简化
这里有几个fill
示例:
// keep reading til we run out of cities in the file
void fill_vector(vector<City>& cities)
{
ifstream ifs("cities.txt.");
City city;
while (!ifs.fail() && !ifs.bad())
{
ifs >> city;
cities.push_back(city);
}
}
// only read 'n' cities
void fill_array(array<City, 5>& cities, size_t count)
{
ifstream ifs("cities.txt.");
for (size_t i = 0; i < count; i++)
ifs >> cities[i];
}
//继续阅读,直到文件中的城市用完为止
空洞填充向量(向量和城市)
{
ifstream ifs(“cities.txt”);
城市;
而(!ifs.fail()&&!ifs.bad())
{
ifs>>城市;
城市。推回(城市);
}
}
//只读“n”个城市
空白填充数组(数组和城市、大小\u t计数)
{
ifstream ifs(“cities.txt”);
对于(大小i=0;i>城市[i];
}
您使用了错误的填充。您想要的函数是中的模板版本
因此,为了使用默认的City
对象初始化每个元素,您的调用将变成:
std::fill(hm, &(hm[n]), City());
或(更具可读性并显示意图):
编辑:我现在明白了,我误解了你的问题,你想用存储的对象填充你的hm
数组
正如其他答案中所建议的,将fill
函数的签名更改为fill(City*const arr,size\t const n)
应该可以解决这个问题。我对std::vector和std::一无所知。。。然而该函数:void fill(City&arr,int size)与我的程序的对应程度如何?在我的回复中添加了两个函数。我没有亲自测试过。检查fail()
和bad()
可能是多余的,但您可以自己检查;-)我认为短语void fill(City…)的身体想要什么?
有点让人困惑,不是吗?
std::fill(&(hm[0]), &(hm[n]), City());