#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点!!!!大哥大姐!@!帮帮我啦!!!!!
13 个解决方案
#1
你类里声明的重载<<的友元和你后面定义的参数根本就不一样,就相当于它只有声明没有定义
而且你在类里的那个友元也没声明成模板
而且你在类里的那个友元也没声明成模板
#2
如果在main里面把 std::cout<<df<<std::endl;去掉就可以链接!!
----------------
如果没错的话, 楼主用的应该是VC6, 这个问题我也遇到过, 如果不用STD名字空间, 而用iostream。h头文件, 则不会出现问题, 百思不解后, 我把这当做是VC6对template支持不好。
----------------
如果没错的话, 楼主用的应该是VC6, 这个问题我也遇到过, 如果不用STD名字空间, 而用iostream。h头文件, 则不会出现问题, 百思不解后, 我把这当做是VC6对template支持不好。
#3
不过楼主的函数声明处, 确实应该把第二个参数改为const。
#4
friend std::ostream &operator << (std::ostream &out,CSeqStack<TYPE>& Mb);
template <typename TYPE>
std::ostream &operator << (std::ostream &out,const CBaseStack<TYPE>& Mb)
楼上真眼尖, 不拿来仔细对比还真没发现.
template <typename TYPE>
std::ostream &operator << (std::ostream &out,const CBaseStack<TYPE>& Mb)
楼上真眼尖, 不拿来仔细对比还真没发现.
#5
VC6对标准C++支持的不好 好像友元和运算符重载不支持说
#6
有关模版和friend之间的交互,很多编译器支持的不好,如果楼主用的是vc6,建议还是赶紧换掉它,因为vc6本来对标准支持的就很差,像模版这种技术它更是“望尘莫及”了。。。
#7
学C++ 用Dev C++挺好的 对标准支持的不错
#8
把声明改好后!!还是只能编译,不能链接啊!!奇怪啊!!!!!我去DEV了...还是有一个错误!!一个警告....在Visual Studio上是两个错误!!!!!
看来还是没找到原因哦!!!
看来还是没找到原因哦!!!
#9
[Linker Error] undefined reference to `operator<<(std::ostream&, CSeqStack<int> const&)'
37 C:\Documents and Settings\NET\My Documents\新建文件夹\Untitled1.cpp [Warning] friend declaration `std::ostream& operator<<(std::ostream&, const CSeqStack<TYPE>&)' declares a non-template function
37 C:\Documents and Settings\NET\My Documents\新建文件夹\Untitled1.cpp [Warning] friend declaration `std::ostream& operator<<(std::ostream&, const CSeqStack<TYPE>&)' declares a non-template function
#10
google hurb sutter的"Befriending Templates"一文
#11
friend std::ostream &operator << (std::ostream &out,CSeqStack<TYPE>& Mb);
----->
template <typename T>
friend std::ostream &operator << (std::ostream &out,CSeqStack<T>& Mb);
----->
template <typename T>
friend std::ostream &operator << (std::ostream &out,CSeqStack<T>& Mb);
#12
//#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通过了编,并且可以正常连接,运行一切正常!
你那个模板函数的实现和那个类是放在一起吗;
#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通过了编,并且可以正常连接,运行一切正常!
你那个模板函数的实现和那个类是放在一起吗;
#13
原因找到了,是在<C++ PRIMER>上找到的!!
我是忘记了做提前声明了!!!!导致类模版把友员当作普通非函数模版处理了!!呵呵!!不好意思啊!!麻烦各位哦!!还有啊!!特别谢谢二楼的!!!!!!也谢谢各位了!!!!
至于位什么大家可以去我的博客看看!!
类模版中的友员声明
http://hi.baidu.com/horsetail/blog/item/e72f4d43717a7c119313c6c5.html
我是忘记了做提前声明了!!!!导致类模版把友员当作普通非函数模版处理了!!呵呵!!不好意思啊!!麻烦各位哦!!还有啊!!特别谢谢二楼的!!!!!!也谢谢各位了!!!!
至于位什么大家可以去我的博客看看!!
类模版中的友员声明
http://hi.baidu.com/horsetail/blog/item/e72f4d43717a7c119313c6c5.html
#1
你类里声明的重载<<的友元和你后面定义的参数根本就不一样,就相当于它只有声明没有定义
而且你在类里的那个友元也没声明成模板
而且你在类里的那个友元也没声明成模板
#2
如果在main里面把 std::cout<<df<<std::endl;去掉就可以链接!!
----------------
如果没错的话, 楼主用的应该是VC6, 这个问题我也遇到过, 如果不用STD名字空间, 而用iostream。h头文件, 则不会出现问题, 百思不解后, 我把这当做是VC6对template支持不好。
----------------
如果没错的话, 楼主用的应该是VC6, 这个问题我也遇到过, 如果不用STD名字空间, 而用iostream。h头文件, 则不会出现问题, 百思不解后, 我把这当做是VC6对template支持不好。
#3
不过楼主的函数声明处, 确实应该把第二个参数改为const。
#4
friend std::ostream &operator << (std::ostream &out,CSeqStack<TYPE>& Mb);
template <typename TYPE>
std::ostream &operator << (std::ostream &out,const CBaseStack<TYPE>& Mb)
楼上真眼尖, 不拿来仔细对比还真没发现.
template <typename TYPE>
std::ostream &operator << (std::ostream &out,const CBaseStack<TYPE>& Mb)
楼上真眼尖, 不拿来仔细对比还真没发现.
#5
VC6对标准C++支持的不好 好像友元和运算符重载不支持说
#6
有关模版和friend之间的交互,很多编译器支持的不好,如果楼主用的是vc6,建议还是赶紧换掉它,因为vc6本来对标准支持的就很差,像模版这种技术它更是“望尘莫及”了。。。
#7
学C++ 用Dev C++挺好的 对标准支持的不错
#8
把声明改好后!!还是只能编译,不能链接啊!!奇怪啊!!!!!我去DEV了...还是有一个错误!!一个警告....在Visual Studio上是两个错误!!!!!
看来还是没找到原因哦!!!
看来还是没找到原因哦!!!
#9
[Linker Error] undefined reference to `operator<<(std::ostream&, CSeqStack<int> const&)'
37 C:\Documents and Settings\NET\My Documents\新建文件夹\Untitled1.cpp [Warning] friend declaration `std::ostream& operator<<(std::ostream&, const CSeqStack<TYPE>&)' declares a non-template function
37 C:\Documents and Settings\NET\My Documents\新建文件夹\Untitled1.cpp [Warning] friend declaration `std::ostream& operator<<(std::ostream&, const CSeqStack<TYPE>&)' declares a non-template function
#10
google hurb sutter的"Befriending Templates"一文
#11
friend std::ostream &operator << (std::ostream &out,CSeqStack<TYPE>& Mb);
----->
template <typename T>
friend std::ostream &operator << (std::ostream &out,CSeqStack<T>& Mb);
----->
template <typename T>
friend std::ostream &operator << (std::ostream &out,CSeqStack<T>& Mb);
#12
//#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通过了编,并且可以正常连接,运行一切正常!
你那个模板函数的实现和那个类是放在一起吗;
#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通过了编,并且可以正常连接,运行一切正常!
你那个模板函数的实现和那个类是放在一起吗;
#13
原因找到了,是在<C++ PRIMER>上找到的!!
我是忘记了做提前声明了!!!!导致类模版把友员当作普通非函数模版处理了!!呵呵!!不好意思啊!!麻烦各位哦!!还有啊!!特别谢谢二楼的!!!!!!也谢谢各位了!!!!
至于位什么大家可以去我的博客看看!!
类模版中的友员声明
http://hi.baidu.com/horsetail/blog/item/e72f4d43717a7c119313c6c5.html
我是忘记了做提前声明了!!!!导致类模版把友员当作普通非函数模版处理了!!呵呵!!不好意思啊!!麻烦各位哦!!还有啊!!特别谢谢二楼的!!!!!!也谢谢各位了!!!!
至于位什么大家可以去我的博客看看!!
类模版中的友员声明
http://hi.baidu.com/horsetail/blog/item/e72f4d43717a7c119313c6c5.html