首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

[]大哥大姐!帮小弟看看这个有关问题啊模版的

2012-04-17 
[求助]大哥大姐!帮小弟看看这个问题啊!!模版的!#includeiostream#includeCBaseStack templatetypenam

[求助]大哥大姐!帮小弟看看这个问题啊!!模版的!
#include   <iostream>
#include   "CBaseStack "

template   <typename   TYPE>
class   CSeqStack:public   CBaseStack <TYPE> {
public:
        CSeqStack(int   size);
        ~CSeqStack();
        void   Push(const   TYPE   &Ob);                         //1
        void   Pop();                                 //2
        const   TYPE   &Top();                                 //3
        bool   IsEmpty()const;                                 //4
        bool   IsFull()const;        
private:
        TYPE   *m_pSp;
        int   m_MaxSize;
        int   TopMb;
        friend     std::ostream   &operator   < <   (std::ostream   &out,CSeqStack <TYPE> &   Mb);

};

//以下是各成员的定义:
template   <typename   TYPE>
CSeqStack <TYPE> ::CSeqStack(int   size):m_pSp(new   TYPE[size]),m_MaxSize(size),TopMb(-1){}//END

template   <typename   TYPE>
CSeqStack <TYPE> ::~CSeqStack(){delete   []m_pSp;}

template <typename   TYPE>
void   CSeqStack <TYPE> ::Push(const   TYPE&   Ob)
{
        if(IsEmpty()){
                TopMb++;
                *(m_pSp+TopMb)=Ob;
        }
        else
                throw   1;
        return;
        }//END

template   <typename   TYPE>
void   CSeqStack <TYPE> ::Pop()
{
        if(IsEmpty())TopMb--;
        else   throw   2;
        return;
}//END

template   <typename   TYPE>
const   TYPE   &CSeqStack <TYPE> ::Top()
{
        if(IsEmpty())
        return   *(m_pSp+TopMb);
else
        throw   3;
}//END

template   <typename   TYPE>
bool   CSeqStack <TYPE> ::IsEmpty()   const
{
        return   TopMb==-1;
}//END  

template   <typename   TYPE>
bool   CSeqStack <TYPE> ::IsFull()   const
{
        return   TopMb!=-1;
}//END


template   <typename   TYPE>
std::ostream   &operator   < <   (std::ostream   &out,const   CBaseStack <TYPE> &   Mb){
        int   i=Mb.TopMb;
        while(i!=-1)out < <Mb.m_pSp[i--];
        return   out;


}
int   main()
{
        CSeqStack <int>   df(21);
        std::cout < <df < <std::endl;
return   0;
}


        就是红色那两处!哪里错了啊~~如果在main里面把   std::cout < <df < <std::endl;去掉就可以链接!!
        如果不去掉,它只可以通过编译!!!反之不能!!!是不是我的模版弄错了啊!!我对模版不是很了解啊!!!!有哪位大哥大姐帮下我么!!!我想了很久了!!

        如果可以的话告诉原因我!!!不需要直接的答案!

=====================
我在线等啊!!!我等到10点!!!!大哥大姐!@!帮帮我啦!!!!!

[解决办法]
你类里声明的重载 < <的友元和你后面定义的参数根本就不一样,就相当于它只有声明没有定义
而且你在类里的那个友元也没声明成模板
[解决办法]
VC6对标准C++支持的不好 好像友元和运算符重载不支持说
[解决办法]
有关模版和friend之间的交互,很多编译器支持的不好,如果楼主用的是vc6,建议还是赶紧换掉它,因为vc6本来对标准支持的就很差,像模版这种技术它更是“望尘莫及”了。。。
[解决办法]
google hurb sutter的 "Befriending Templates "一文
[解决办法]
friend std::ostream &operator < < (std::ostream &out,CSeqStack <TYPE> & Mb);
----->
template <typename T>
friend std::ostream &operator < < (std::ostream &out,CSeqStack <T> & Mb);
[解决办法]
//#include <iostream.h>

#include <iostream>
using namespace std;
template <typename T>
class A
{
public:
A(T t)
{
m_t = t;
}
T m_t;
friend ostream& operator < < ( ostream&os , const A <T> & t);
};
template <typename T>
ostream& operator < < (ostream&os,const A <T> &t)
{
os < <t.m_t;
return os;
}


int main(int argc , char* argv[])
{
A <int> a(10);
cout < <a < <endl;

return 0;
};

我这个就用VC6通过了编,并且可以正常连接,运行一切正常!
你那个模板函数的实现和那个类是放在一起吗;

热点排行