3
回答
我用的编译器是micsoft visual studio2008

1>d:\program files\microsoft visual studio 9.0\vc\include\xutility(764) : error C2039: “iterator_category”: 不是“pointx”的成员
1>        c:\users\hxk\documents\visual studio 2008\projects\11\11\11.cpp(8) : 参见“pointx”的声明
1>        c:\users\hxk\documents\visual studio 2008\projects\11\11\11.cpp(84): 参见对正在编译的类 模板 实例化“std::iterator_traits<_Iter>”的引用
1>        with
1>        [
1>            _Iter=pointx
1>        ]

这是什么错误该怎么改正

<无标签>
举报
1古月1
发帖于6年前 3回/281阅
共有3个答案 最后回答: 6年前

// 3.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;
class pointx
{
public:
    int operator<=(pointx a)const
 {
  return(x<=a.x);
 }
private:
 int ID;
 float x,y;
};
class pointy
{
public:
 int operator<=(pointy a)const
 {
  return(y<=a.y);
 }
private:
 int p;
 float x,y;
};
template<class type>
void mergesort(type a[],int n)
{
 type *b=new type[n];
 int s=1;
 while(s<n)
 {
  mergepass(a,b,s,n);
  s+=s;
  mergepass(b,a,s,n);
  s+=s;
 }
}
template<class type>
void mergepass(type x[],type y[],int s,int n)
{
 int i=0;
 while(i<n-2*s)
 {
  merge(x,y,i+s-1,i+2*s-1);
  i=i+2*s;
 }
 if(i+s<n)
  merge(x,y,i,i+s-1,n-1);
 else
  for(int j=i;j<=n-1;j++)
   y[j]=x[j];
}
template<class type>
void merge(type c[],type d[],int l,int m,int r)
{
 int i=l,j=m+1,k=1;
 while((i<=m)&&(j<=r))
  if(c[i]<=c[j]) d[k++]=c[i++];
  else d[k++]=c[j++];
  if(i>m)
   for(int q=j;q<=r;q++)
    d[k++]=c[q];
  else
   for(int q=i;q<=m;q++)
    d[k++]=c[q];
}
template<class type>
inline float distance(const type & u,const type & v)
{
 float dx=u.x-v.x;
 float dy=u.y-v.y;
 return sqrt(dx*dx+dy*dy);
}
void closest(pointx x[],pointy y[],pointy z[],int l,int r,pointx & a,pointx & b,float & d)
{
 if(r-1==1)
 {
  a=x[l];
  b=x[r];
  d=distance(x[l],x[r]);
  return;
 }
 if(r-1==2)
 {
  float d1=distance(x[l],x[l+1]);
        float d2=distance(x[l+1],x[r]);
        float d3=distance(x[l],x[r]);
  if(d1<=d2&&d1<=d3)
  {
   a=x[l];
   b=x[l+1];
   d=d1;
   return;
  }
  if(d1<=d3)
  {
   a=x[l+1];
   b=x[r];
   d=d2;
  }
  else
  {
   a=x[l];
   b=x[r];
   d=d3;
  }
  return;
 }
 int m=(l+r)/2;
 int f=l,g=m+1;
 for(int i=l;i<=r;i++)
  if(y[i].p>m) z[g++]=y[i];
  else z[f++]=y[i];
        closest(x,y,z,l,m,a,b,d);
  float dr;
  pointx ar,br;
        closest(x,z,y,m+1,r,ar,br,dr);
  if(dr<d)
  {
   a=ar;
   b=br;
   d=dr;
  }
  merge(z,y,l,m,r);
  int k=l;
  for(int i=l;i<=r;i++)
   if(fabs(y[m].x-y[i].x)<d) z[k++]=y[i];
  for(int i=l;i<k;i++)
  {
   for(int j=i+1;j<k&&z[j].y-z[i].y<d;j++)
   {
    float dp=distance(z[i],z[j]);
    if(dp<d)
    {
     d=dp;
     a=x[z[i].p];
     b=x[z[j].p];
    }
   }
  }
}
bool cpair2(pointx x[],int n,pointx & a,pointx & b,float & d)
{
 if(n<2) return false;
 mergesort(x,n);
 pointy *y=new pointy[n];
 for(int i=0;i<n;i++)
 {
  y[i].p=i;
  y[i].x=x[i].x;
  y[i].y=x[i].y;
 }
 mergesort(y,n);
 pointy *z=new pointy[n];
 closest(x,y,z,0,n-1,a,b,d);
 delete[] y;
 delete[] x;
 return true;
}


int _tmain(int argc, _TCHAR* argv[])
{
 return 0;
}

主函数还没写

估计是你干坏事了。重名了。把标准库里的类给替了.你把你写的类前面都加上 my_,再试一下。
--- 共有 6 条评论 ---
中山野鬼回复 @1古月1 : 哪段代码不需要了。就#if 0 #endif。或者 /* */或者 //,就是说把代码注释掉。 6年前 回复
1古月1回复 @中山野鬼 : 我不太会屏蔽,能说得清楚点吗? 6年前 回复
中山野鬼回复 @1古月1 : 老办法,用#if 0,依次封闭代码,先找到是定义的哪个类导致错误的。你 把你pointx 的类和使用他的地方全部屏蔽掉。 6年前 回复
1古月1回复 @中山野鬼 : 那该怎么办呢 6年前 回复
中山野鬼回复 @1古月1 : 不是你没动过,而是你的代码可能库函数有重名。还有种情况就是你的库函数不全。安装时缺失东西。我是linux环境没办法帮你验证,只能帮你猜猜 6年前 回复
顶部