c++模版编程问题,求解救

sysabod 2010-04-27 10:54:30
请看代码,感觉不是很难理解,但是出错信息令我头都昏了。

#include <iostream>
#include <deque>
using namespace std;
template <class T>
class Stack
{
private:
deque<T> elems;
public:
Stack();
Stack(int n);
Stack(const Stack<T>&);
void push(const T&);
void pop();
T top()const;
bool isEmpty()const
{
return elems.empty();
}
template <class T2>
Stack<T>& operator= (const Stack<T2>&);
};
template <class T>
Stack<T>::Stack()
{
;
}

template <class T>
Stack<T>::Stack(int n)
{
elems = *(new deque<T>(n,0));
}
template <class T>
Stack<T>:: Stack(const Stack<T>& another)
{
this->elems = *new deque<T>(another);
}
template <class T>
void Stack<T>::push(const T& arg)
{
elems.push_front(arg);
}

template <class T>
void Stack<T>::pop()
{
elems.pop_front();
}
template <class T>
T Stack<T>::top()const
{
return elems.front();
}

template <class T>
template <class T2>
Stack<T>& Stack<T>::operator=(const Stack<T2>& operand2)
{
if((void*)this == (void*)&operand2)
{
return *this;
}
Stack<T2> tmp(operand2);
elems.clear();
while(tmp.isEmpty() == false)
{
this->push(tmp.top());
tmp.pop();
}
return *this;
}

template <class T>
void fillStack(Stack<T>& s, T* begin,T* end )
{
for(T* p = begin; p != end; p++)
{
s.push(*p);
}
}

template <class T>
void print(const Stack<T>& s )
{
while(!s.isEmpty())
{
cout<<s.top()<<" ";
s.pop();
}
cout<<endl;
}
int main(int argc, char *argv[])
{
typedef int IntegerArray[];
typedef float FloatArray[];
IntegerArray a = {1,2,3,40};
FloatArray b = {11.1,22.3,33.24,44.15,50.25};
Stack<int> intStack;
Stack<float> floatStack;
int a_len = sizeof(a)/sizeof(int);
int b_len = sizeof(b)/sizeof(int);
fillStack<int>(intStack,a,a+a_len);
cout<<"Initial int stack:";
print<int>(intStack);



fillStack<float>(floatStack,b,b+b_len);
cout<<"Initial float stack:";
print<float>(floatStack);

intStack = floatStack;
cout<<"after assignment,int stack:", print<int>(intStack);
cout<<"after assignment,float stack:",print<float>(floatStack);

//print();

return 0;
}


下面是我的出错信息

--------------------配置: MinGW3.4.5 - CUI Debug, 编译器类型: MinGW--------------------

正在编译 C:\Documents and Settings\eb\桌面\templateClassAssignment.cpp...
[Error] C:\Documents and Settings\eb\桌面\templateClassAssignment.cpp:105: instantiated from here
[Error] C:\Documents and Settings\eb\桌面\templateClassAssignment.cpp:89: error: passing `const Stack<int>' as `this' argument of `void Stack<T>::pop() [with T = int]' discards qualifiers
[Error] C:\Documents and Settings\eb\桌面\templateClassAssignment.cpp:111: instantiated from here
[Error] C:\Documents and Settings\eb\桌面\templateClassAssignment.cpp:89: error: passing `const Stack<float>' as `this' argument of `void Stack<T>::pop() [with T = float]' discards qualifiers
[Error] C:\Documents and Settings\eb\桌面\templateClassAssignment.cpp:113: instantiated from here
[Warning] C:\Documents and Settings\eb\桌面\templateClassAssignment.cpp:68: warning: passing `float' for converting 1 of `void Stack<T>::push(const T&) [with T = int]'
[Error] C:\Documents and Settings\eb\桌面\templateClassAssignment.cpp:64: instantiated from `Stack<T>& Stack<T>::operator=(const Stack<T2>&) [with T2 = float, T = int]'
[Error] C:\Documents and Settings\eb\桌面\templateClassAssignment.cpp:113: instantiated from here
[Error] C:\Documents and Settings\eb\桌面\templateClassAssignment.cpp:37: error: no matching function for call to `std::deque<float, std::allocator<float> >::deque(const Stack<float>&)'
[Error] C:\PROGRA~1\C-FREE~1\mingw32\include\C__~1\342EBD~1.5\bits\stl_deque.h:670: note: candidates are: std::deque<_Tp, _Alloc>::deque(const std::deque<_Tp, _Alloc>&) [with _Tp = float, _Alloc = std::allocator<float>]
[Error] C:\PROGRA~1\C-FREE~1\mingw32\include\C__~1\342EBD~1.5\bits\stl_deque.h:659: note: std::deque<_Tp, _Alloc>::deque(size_t) [with _Tp = float, _Alloc = std::allocator<float>]
[Error] C:\PROGRA~1\C-FREE~1\mingw32\include\C__~1\342EBD~1.5\bits\stl_deque.h:647: note: std::deque<_Tp, _Alloc>::deque(size_t, const _Tp&, const typename std::_Deque_base<_Tp, _Alloc>::allocator_type&) [with _Tp = float, _Alloc = std::allocator<float>]
[Error] C:\PROGRA~1\C-FREE~1\mingw32\include\C__~1\342EBD~1.5\bits\stl_deque.h:636: note: std::deque<_Tp, _Alloc>::deque(const typename std::_Deque_base<_Tp, _Alloc>::allocator_type&) [with _Tp = float, _Alloc = std::allocator<float>]

编译中止 C:\Documents and Settings\eb\桌面\templateClassAssignment.cpp: 12 个错误, 1 个警告
感觉红色那句错了真是很难理解,其他的不是很明白。请大侠不吝指教。
...全文
251 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sysabod 2010-04-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taodm 的回复:]

print(const Stack<T>& s )
去补const成员函数的课吧。
[/Quote]
你好,这个不是成员函数,不过我的形参是常引用,但是函数却改变了值,是这个错误,但是我把
print(const Stack<T>& s )改为print(Stack<T>& s )还是有错误,现睡个午觉,下午再研究。
勇敢的搬砖人 2010-04-27
  • 打赏
  • 举报
回复
路过帮顶
taodm 2010-04-27
  • 打赏
  • 举报
回复
print(const Stack<T>& s )
去补const成员函数的课吧。
ImJaden 2010-04-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sysabod 的回复:]
搞定,原来是deque类没有这个构造函数deque<T>(another),改了一下,可以了

C/C++ code
#include <iostream>
#include <deque>
#include <algorithm>
#include <iterator>
using namespace std;
template <class T>
class Stack
{……
[/Quote]
强人呀!
ypb362148418 2010-04-27
  • 打赏
  • 举报
回复
找本教材看看模板编程吧,C++编程思想就不错
sysabod 2010-04-27
  • 打赏
  • 举报
回复
搞定,原来是deque类没有这个构造函数deque<T>(another),改了一下,可以了
#include <iostream>
#include <deque>
#include <algorithm>
#include <iterator>
using namespace std;
template <class T>
class Stack
{
private:
deque<T> elems;
public:
Stack();
Stack(int n);
Stack(const Stack<T>&);
void push(const T&);
void pop();
T top()const;
bool isEmpty()const
{
return elems.empty();
}
template <class T2>
Stack<T>& operator= (Stack<T2>&);
};
template <class T>
Stack<T>::Stack()
{
;
}

template <class T>
Stack<T>::Stack(int n)
{
elems = *(new deque<T>(n,0));
}
template <class T>
Stack<T>:: Stack(const Stack<T>& another)
{
//delete &elems;
this->elems = deque<T>(another.elems);
}
template <class T>
void Stack<T>::push(const T& arg)
{
elems.push_front(arg);
}

template <class T>
void Stack<T>::pop()
{
elems.pop_front();
}
template <class T>
T Stack<T>::top()const
{
return elems.front();
}

template <class T>
template <class T2>
Stack<T>& Stack<T>::operator=(Stack<T2>& operand2)
{
if((void*)this == (void*)&operand2)
{
return *this;
}
Stack<T2> tmp(operand2);
elems.clear();
while(tmp.isEmpty() == false)
{
this->push(tmp.top());
tmp.pop();
}
return *this;
}

template <class T>
void fillStack(Stack<T>& s, T* begin,T* end )
{
for(T* p = begin; p != end; p++)
{
s.push(*p);
}
}

template <class T>
void print(const Stack<T>& tmp )
{
Stack<T> s(tmp);
while(!s.isEmpty())
{
cout<<s.top()<<" ";
s.pop();
}
cout<<endl;
}
int main(int argc, char *argv[])
{
typedef int IntegerArray[];
typedef float FloatArray[];
IntegerArray a = {1,2,3,40};
FloatArray b = {11.1,22.3,33.24,44.15,50.25};
Stack<int> intStack;
Stack<float> floatStack;
int a_len = sizeof(a)/sizeof(int);
int b_len = sizeof(b)/sizeof(int);


fillStack<int>(intStack,a,a+a_len);
cout<<"Initial int stack:";
print<int>(intStack);



fillStack<float>(floatStack,b,b+b_len);
cout<<"Initial float stack:";
print<float>(floatStack);

intStack = floatStack;
// floatStack = intStack;
cout<<"after assignment,int stack:",print<int>(intStack);
cout<<"after assignment,float stack:",print<float>(floatStack);

//print();

return 0;
}
haiwa888 2010-04-27
  • 打赏
  • 举报
回复
template <class T>
Stack<T>::Stack(int n)
{
elems = *(new deque<T>(n,0));
}
这样写貌似不好吧,new的deque<T>(n,0)没有指针指向它啊,内存泄露了把

template <class T>
template <class T2>
Stack<T>& Stack<T>::operator=(const Stack<T2>& operand2)
{
if((void*)this == (void*)&operand2)
{
return *this;
}
Stack<T2> tmp(operand2);
elems.clear();
while(tmp.isEmpty() == false)
{
this->push(tmp.top());
tmp.pop();
}
return *this;
}
重载赋值操作符不是这样的,应该是
template <class T>
Stack<T>& Stack<T>::operator=(const Stack<T>& operand2)
{
if(this == &operand2)
{
return *this;
}
Stack<T> tmp(operand2);
elems.clear();
while(!tmp.isEmpty())
{
this->push(tmp.top());
tmp.pop();
}
return *this;
}

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧