(istream&City&); }; ostream&operator,c++,C++" /> (istream&City&); }; ostream&operator,c++,C++" />

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());