注册 登录
编程论坛 C++教室

类模板与运算符重载问题

tonlin 发布于 2010-06-02 19:05, 3627 次点击
程序代码:
#include "stdafx.h"
#include "iostream"
using namespace std;
#include "iomanip"
template <class T>
class Array
{
   private:
            T *phead;int H;
   public :
            Array(T *a,int h)
            {
                T *t;
                H=h;  phead=new T[H];  t=phead;
                for(int i=0;i<H;i++)                 
                *t++=*a++;
            }
            ~Array(){delete []phead;}
            void Sort();
            void Search(T a);
            T Sum();
            template <class X>
            friend ostream & operator<<(ostream &out,Array<X> &a);
            //void Display();            

};

template <class X>
ostream & operator<<(ostream &out,Array<X> &a)
{
   out<<"输出结果:"<<endl;
   for(int i=0;i<a.H;i++)      
    out<<setw(4)<<*(a.phead+i);   
    out<<endl;
    return out;
}
template <class T>
void Array<T>::Sort()
{
   int i,j,k;T temp;
   for(i=0;i<H;i++)
   {
     k=i;
     for(j=i+1;j<H;j++)
         if(*(phead+k)>*(phead+j))k=j;
     if(k!=i)
     {   temp=*(phead+i);
         *(phead+i)=*(phead+k);
         *(phead+k)=temp;
     }
   }

}
template <class T>
void Array<T>::Search(T a)
{
  int i,k=0;
  T *temp; temp=phead;
  for(i=0;i<H;i++)
  { if(a==*(temp+i))
    {
       k=1;break;
    }
  }
  if(k==1)cout<<"找到其下标为:"<<i<<endl;
  else
     cout<<"No find !"<<endl;
}
template <class T>
T Array<T>::Sum()
{
  T sum=0.0;
  int i;
  for(i=0;i<H;i++)
      sum=sum+*(phead+i);
  return sum;
}
/*template <class T>
void Array<T>::Display()
{

 cout<<"结果:"<<endl;

 for(int i=0;i<H;i++)      
    cout<<setw(4)<<*(phead+i);
  cout<<endl;
}
*/
int _tmain(int argc, _TCHAR* argv[])
{  
    int a[6]={4,6,7,3,8,1};
    double b[6]={4.3,6.5,7.6,3.3,8.7,1.9};
    Array <int> A(a,6);
    //A.Display();
    cout<<A;
    A.Sort();
    //A.Display();
    cout<<A;
    A.Search(8);
    cout<<"数组和:"<<A.Sum()<<endl;
    Array <double> B(b,6);
    //B.Display();
    cout<<B;
    B.Sort();
    //B.Display();
    cout<<B;
    B.Search(3.3);
    cout<<"数组和:"<<B.Sum()<<endl;
    return 0;
}
友元重载<<运算符出错 没办法了 有错不会改 来求救了



[ 本帖最后由 tonlin 于 2010-6-2 23:26 编辑 ]
6 回复
#2
lintaoyn2010-06-02 19:47
//#include <stdafx.h>
#include <iostream>
using namespace std;
#include "iomanip"
template <class T>
class Array
{
   private:
            T *phead;int H;
   public :
            Array(T *a,int h)
            {
                T *t;
                H=h;  phead=new int[H];  t=phead;
                for(int i=0;i<H;i++)                 
                *t++=*a++;
            }
            ~Array(){delete []phead;}
            void Sort();
            void Search(int a);
            friend ostream & operator<<(ostream &out,Array<T> &a);
           
};
template <class T>
ostream & operator<<(ostream &out,Array<T> &a)
{
   out<<"输出结果:"<<endl;
   for(int i=0;i<a.H;i++)      
    out<<setw(4)<<*(a.phead+i);   
    out<<endl;
    return out;
}
template <class T>
void Array<T>::Sort()
{
   int i,j,k,temp;
   for(i=0;i<H;i++)
   {
     k=i;
     for(j=i+1;j<H;j++)
         if(*(phead+k)>*(phead+j))k=j;
     if(k!=i)
     {   temp=*(phead+i);
         *(phead+i)=*(phead+k);
         *(phead+k)=temp;
     }
   }

}
template <class T>
void Array<T>::Search(int a)
{
  int i,k=0;
  T *temp; temp=phead;
  for(i=0;i<H;i++)
  { if(a==*(temp+i))
    {
       k=1;break;
    }
  }
  if(k==1)cout<<"找到其下标为:"<<i<<endl;
  else
     cout<<"No find !"<<endl;
}
int main(int argc, char* argv[])//我用的是绿色版的VC6,给你改成这个样子了。
{  
    int a[6]={4,6,7,3,8,1};
    Array <int> A(a,6);
    cout<<A;
    A.Sort();
    cout<<A;
    A.Search(5);
    return 0;
}
#3
tonlin2010-06-02 19:51
回复 2楼 lintaoyn
改哪里了看不出来额
#4
lijm19892010-06-02 21:53
VC6的能力不敢恭维。。。。
LZ错在:
     1、把友元函数当成了类成员。
     2、函数声明部分 : void Search(int a); 函数体: void Array<T>::Search(T a)  ,不统一。

解决方法1:(推荐)
#include "stdafx.h"
#include "iostream"
using namespace std;
#include "iomanip"
template <class T>
class Array
{
   private:
            T *phead;int H;
   public :
            Array(T *a,int h)
            {
                T *t;
                H=h;  phead=new int[H];  t=phead;
                for(int i=0;i<H;i++)                 
                *t++=*a++;
            }
            ~Array(){delete []phead;}
            void Sort();
            void Search(int a);
            friend ostream & operator<< <T>(ostream &out,Array<T> &a); //  添加<T>,是为了告诉编译器,这是模板中的友元
            
};
template <class T>
ostream & operator<<(ostream &out,Array<T> &a)
{
   out<<"输出结果:"<<endl;
   for(int i=0;i<a.H;i++)      
    out<<setw(4)<<*(a.phead+i);   
    out<<endl;
    return out;
}
template <class T>
void Array<T>::Sort()
{
   int i,j,k;
   T temp;
   for(i=0;i<H;i++)
   {
     k=i;
     for(j=i+1;j<H;j++)
         if(*(phead+k)>*(phead+j))k=j;
     if(k!=i)
     {   temp=*(phead+i);
         *(phead+i)=*(phead+k);
         *(phead+k)=temp;
     }
   }

}
template <class T>
void Array<T>::Search(int a)  // 这里改了,形参保持一致
{
  int i,k=0;
  T *temp; temp=phead;
  for(i=0;i<H;i++)
  { if(a==*(temp+i))
    {
       k=1;break;
    }
  }
  if(k==1)cout<<"找到其下标为:"<<i<<endl;
  else
     cout<<"No find !"<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{  
    int a[6]={4,6,7,3,8,1};
    Array <int> A(a,6);
    cout<<A;
    A.Sort();
    cout<<A;
    A.Search(5);
    system("pause");
    return 0;
}
解决方法2:


#include "stdafx.h"
#include "iostream"
using namespace std;
#include "iomanip"
template <class T>
class Array
{
   private:
            T *phead;int H;
   public :
            Array(T *a,int h)
            {
                T *t;
                H=h;  phead=new int[H];  t=phead;
                for(int i=0;i<H;i++)                 
                *t++=*a++;
            }
            ~Array(){delete []phead;}
            void Sort();
            void Search(int a);
            template <class X>
            friend ostream & operator<< (ostream &out,Array<X> &a);
        //  直接再来一个      
};
           ... ...
           ... ...
           ... ...
解决方法三: 直接把友元函数体放进类里,应该可以解决,不过~~~~~~~
#5
tonlin2010-06-02 23:27
回复 4楼 lijm1989
实在太感谢你了啊
#6
使命0012010-06-03 17:18
太好了!  找了半天终于找到了
#7
gaoce2272010-06-03 17:25
没心思阅读长代码,悲剧。
1