无法将参数1从“Class *”转换为“double []”

时间:2012-06-15 11:06:09

标签: c++

嗯,这是我在这里得到的C ++代码,无法编译

#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;
 }

这是编译时遇到的错误:

  

错误C2664:'fill':无法将参数1从'City *'转换为'int   []'

不知怎的,我看到了,它说Class'City *“和int []数组有问题,但是无法搞清楚。我用'double'改变'int'但是同样的概率。 这是问题,否则它似乎是一个简单的数组填充函数从文件。 知道它有什么问题吗?

那么,怎么会

  

void fill(City&amp; arr,int size)   的身体想要?

3 个答案:

答案 0 :(得分:2)

void fill(int arr[], int size)表示您需要将int的数组传递给fill。但是,您在主要文件中传递了City的实例,特别是hm

我假设您正在尝试从City读取cities.txt描述列表(因此具有适当的流提取/插入运算符)。更改fill的签名以接受指向City个对象的指针,以便您可以填写City个对象而不是int个数组。

void fill(City *arr, int size); 

确保传递给main中fill的参数是一个正确分配的City对象数组,其大小至少为sz,其中sz是您传递的内容作为第二个参数。请记住致电delete []以释放您创建的阵列。

更惯用的方法是使用vector<City>,这样您就不必担心内存管理问题。您修改后的fill签名将为:

void fill(std::vector<City>& c); // note we no longer need the second argument

您需要#include <vector>才能使用vector<City>

最后,为了利用RVO,只需按值返回vector<City>,而不是将其作为参数传递。所以,你会做类似的事情:

std::vector<City> fill(); // cleaner, faster

答案 1 :(得分:0)

void fill(int arr[], int size)需要一个int数组。您正尝试将City数组传递给它。

您可以编写新函数void fill(City& arr, int size),也可以考虑编写模板化函数template<class T> void fill(T* arr, size)等。

另请考虑使用std::vectorstd::array而不是裸阵列。边界检查和内存管理将变得非常容易。

以下是几个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];
}

答案 2 :(得分:0)

你使用了错误的fill。您想要的功能是<algorithm>中的模板化版本:void fill (ForwardIterator first, ForwardIterator last, const T& value);(请参阅here)。

因此,为了使用默认的City对象初始化每个元素,您的调用将变为:

std::fill(hm, &(hm[n]), City());

或(更具可读性和显示意图):

std::fill(&(hm[0]), &(hm[n]), City());

编辑:我现在看到我误解了您的问题,并希望用存储的对象填充hm数组。

正如其他答案中所建议的那样,将fill功能的签名更改为fill (City * const arr, size_t const n)应该可以解决此问题。