[求助]大哥大姐!帮小弟看看这个问题啊!!模版的!
#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通过了编,并且可以正常连接,运行一切正常!
你那个模板函数的实现和那个类是放在一起吗;