| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3627 人关注过本帖
标题:类模板与运算符重载问题
只看楼主 加入收藏
tonlin
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2009-10-14
结帖率:69.23%
收藏
已结贴  问题点数:10 回复次数:6 
类模板与运算符重载问题
程序代码:
#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 编辑 ]
搜索更多相关主题的帖子: 运算符 模板 重载 
2010-06-02 19:05
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:0 
//#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;
}

迭代的是人,递归的是神。
2010-06-02 19:47
tonlin
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2009-10-14
收藏
得分:0 
回复 2楼 lintaoyn
改哪里了看不出来额
2010-06-02 19:51
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:10 
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);
        //  直接再来一个      
};
           ... ...
           ... ...
           ... ...
解决方法三: 直接把友元函数体放进类里,应该可以解决,不过~~~~~~~
2010-06-02 21:53
tonlin
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2009-10-14
收藏
得分:0 
回复 4楼 lijm1989
实在太感谢你了啊
2010-06-02 23:27
使命001
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-6-3
收藏
得分:0 
太好了!  找了半天终于找到了
2010-06-03 17:18
gaoce227
Rank: 4
来 自:山东
等 级:业余侠客
帖 子:134
专家分:218
注 册:2008-4-5
收藏
得分:0 
没心思阅读长代码,悲剧。
2010-06-03 17:25
快速回复:类模板与运算符重载问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015161 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved