问个问题,template的

langzi8818 2005-04-08 03:23:11
头文件
#include <deque>
#include <stdexcept>
#include <memory>

template <typename T,
template <typename ELEM,typename =std::allocator<ELEM> >class CONT=std::deque>
class Stack
{
private:
CONT<T> elem;
public:
void push(T const&);
void pop();
T top() const;
bool empty() const {return elems.empty();}
template <typename T2
template<typename ELEM2,typename=std::allocator<ELEM2> > class CONT2>
Stack<T,CONT>& operator=(Stack<T2,CONT2> const&);
};
template <typename T,template <typename,typename> class CONT>
void Stack<T,CONT>::push(T const& elem)
{
elems.push_back(elem);
}
template <typename T,template <typename,typename> class CONT>
void Stack<T,CONT>::pop()
{
if(elem.empty())
{
throw std::out_of_range("Stack<>::pop():empty stack");
}
elem.pop_back();
}
template<typename T,template<typename,typename> class CONT>
T Stack<T,CONT> top()const
{
if(elem.empty())
{
throw std::out_of_range("stack<>::top():empty stack");
}
return elem.back();
}
template<typename T,template<typename,typename>class CONT>
template<typename T2,template<typename,typename> class CONT2>
Stack<T,CONT> &Stack<T,CONT>::operator=(Stack<T2,CONT2> const&op2)
{
if((void*)this==(void*)&op2)
return*this;
Stack<T2,CONT2>tem(op2);
elem.clear();
while(!tem.empty())
{
elem.push_front(tem.top());
tmp.pop();
}
return *this;
}
main文件
#include <iostream>
#include <string>
#include <cstdlib>
#include "a.h"
int main()
{
try
{
Stack<int> intStack;
Stack<float> floatStack;
intStack.push(42);
intStack.push(7);
floatStack.push(7.7);
floatStack=intStack;
std::cout<<floatStack.top()<<std::endl;
floatStack.pop();
std::cout<<floatStack.top()<<std::endl;
floatStack.pop();
std::cout<<floatStack.top()<<std::endl;
floatSatck.pop();
}
catch(std::exception const& e)
{
std::cerr<<"exception:"<<e.what()<<std::endl;
}
}
结果出现错误如下:
Compiling...
cc.cpp
f:\vc\msdev98\myprojects\dd\a.h(6) : error C2954: template definitions cannot nest
f:\vc\msdev98\myprojects\dd\a.h(6) : error C2951: template declarations are only permitted at global or namespace scope
f:\vc\msdev98\myprojects\dd\a.h(6) : error C2226: syntax error : unexpected type 'CONT'
f:\vc\msdev98\myprojects\dd\a.h(8) : error C2143: syntax error : missing '>' before '{'
f:\vc\msdev98\myprojects\dd\a.h(19) : error C2059: syntax error : '<end Parse>'
f:\vc\msdev98\myprojects\dd\a.h(20) : error C2954: template definitions cannot nest
f:\vc\msdev98\myprojects\dd\a.h(20) : error C2954: template definitions cannot nest
f:\vc\msdev98\myprojects\dd\a.h(20) : error C2951: template declarations are only permitted at global or namespace scope
f:\vc\msdev98\myprojects\dd\a.h(20) : error C2991: redefinition of template parameter '__unnamed'
f:\vc\msdev98\myprojects\dd\a.h(20) : error C2226: syntax error : unexpected type 'CONT'
f:\vc\msdev98\myprojects\dd\a.h(22) : error C2143: syntax error : missing '>' before '{'
f:\vc\msdev98\myprojects\dd\a.h(24) : error C2059: syntax error : '<end Parse>'
f:\vc\msdev98\myprojects\dd\a.h(26) : error C2039: 'pop' : is not a member of '`global namespace''
f:\vc\msdev98\myprojects\dd\a.h(27) : error C2143: syntax error : missing ';' before '{'
f:\vc\msdev98\myprojects\dd\a.h(27) : error C2447: missing function header (old-style formal list?)
f:\vc\msdev98\myprojects\dd\a.h(34) : error C2954: template definitions cannot nest
f:\vc\msdev98\myprojects\dd\a.h(34) : error C2954: template definitions cannot nest
f:\vc\msdev98\myprojects\dd\a.h(34) : error C2951: template declarations are only permitted at global or namespace scope
f:\vc\msdev98\myprojects\dd\a.h(34) : error C2991: redefinition of template parameter '__unnamed'
f:\vc\msdev98\myprojects\dd\a.h(34) : error C2226: syntax error : unexpected type 'CONT'
f:\vc\msdev98\myprojects\dd\a.h(36) : error C2143: syntax error : missing '>' before '{'
f:\vc\msdev98\myprojects\dd\a.h(42) : error C2059: syntax error : '<end Parse>'
f:\vc\msdev98\myprojects\dd\a.h(45) : error C2039: '=' : is not a member of '`global namespace''
f:\vc\msdev98\myprojects\dd\a.h(46) : error C2143: syntax error : missing ';' before '{'
f:\vc\msdev98\myprojects\dd\a.h(46) : error C2447: missing function header (old-style formal list?)
F:\vc\MSDev98\MyProjects\dd\cc.cpp(9) : error C2065: 'Stack' : undeclared identifier
F:\vc\MSDev98\MyProjects\dd\cc.cpp(9) : error C2062: type 'int' unexpected
F:\vc\MSDev98\MyProjects\dd\cc.cpp(10) : error C2062: type 'float' unexpected
F:\vc\MSDev98\MyProjects\dd\cc.cpp(11) : error C2065: 'intStack' : undeclared identifier
F:\vc\MSDev98\MyProjects\dd\cc.cpp(11) : error C2228: left of '.push' must have class/struct/union type
F:\vc\MSDev98\MyProjects\dd\cc.cpp(12) : error C2228: left of '.push' must have class/struct/union type
F:\vc\MSDev98\MyProjects\dd\cc.cpp(13) : error C2065: 'floatStack' : undeclared identifier
F:\vc\MSDev98\MyProjects\dd\cc.cpp(13) : error C2228: left of '.push' must have class/struct/union type
F:\vc\MSDev98\MyProjects\dd\cc.cpp(15) : error C2228: left of '.top' must have class/struct/union type
F:\vc\MSDev98\MyProjects\dd\cc.cpp(16) : error C2228: left of '.pop' must have class/struct/union type
F:\vc\MSDev98\MyProjects\dd\cc.cpp(17) : error C2228: left of '.top' must have class/struct/union type
F:\vc\MSDev98\MyProjects\dd\cc.cpp(18) : error C2228: left of '.pop' must have class/struct/union type
F:\vc\MSDev98\MyProjects\dd\cc.cpp(19) : error C2228: left of '.top' must have class/struct/union type
F:\vc\MSDev98\MyProjects\dd\cc.cpp(20) : error C2065: 'floatSatck' : undeclared identifier
F:\vc\MSDev98\MyProjects\dd\cc.cpp(20) : error C2228: left of '.pop' must have class/struct/union type
F:\vc\MSDev98\MyProjects\dd\cc.cpp(24) : fatal error C1903: unable to recover from previous error(s); stopping compilation
Error executing cl.exe.

cc.exe - 41 error(s), 0 warning(s)
不知道为什么 ~(VC6)
请指教~呵呵,太菜了
...全文
1500 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
langzi8818 2005-04-09
  • 打赏
  • 举报
回复
版本问题,VC6对template支持的很不好~


回复人: MagicCarmack(梦中情人C++) ( ) 信誉:100 2005-4-9 3:20:44 得分: 0



我为了你感到骄傲!


---------------------------------
什么意思?》
XueBoy163 2005-04-09
  • 打赏
  • 举报
回复
可能是版本问题,你用2003编译试试.
tuoliao722 2005-04-09
  • 打赏
  • 举报
回复
学习
MagicCarmack 2005-04-09
  • 打赏
  • 举报
回复
我为了你感到骄傲!
langzi8818 2005-04-08
  • 打赏
  • 举报
回复
估计是VC6的毛病 ~
kobefly 2005-04-08
  • 打赏
  • 举报
回复
vc6下不支持模板的嵌套

你的第一个信息就是这个吧
yjh1982 2005-04-08
  • 打赏
  • 举报
回复
主要是拼写错误(CONT<T> elem;改为CONT<T> elems;)
,改正后可以在dev cpp通过:


#include <deque>
#include <stdexcept>
#include <memory>

#include <iostream>
#include <string>
#include <cstdlib>

template <typename T,
template <typename ELEM,typename =std::allocator<ELEM> >class CONT=std::deque>
class Stack
{
private:
CONT<T> elems;
public:
void push(T const&);
void pop();
T top() const;
bool empty() const {return elems.empty();}
template <typename T2,
template<typename ELEM2,typename=std::allocator<ELEM2> > class CONT2>
Stack<T,CONT>& operator=(Stack<T2,CONT2> const&);
};
template <typename T,template <typename,typename> class CONT>
void Stack<T,CONT>::push(T const& elem)
{
elems.push_back(elem);
}
template <typename T,template <typename,typename> class CONT>
void Stack<T,CONT>::pop()
{
if(elems.empty())
{
throw std::out_of_range("Stack<>::pop():empty stack");
}
elems.pop_back();
}
template<typename T,template<typename,typename> class CONT>
T Stack<T,CONT>::top()const
{
if(elems.empty())
{
throw std::out_of_range("stack<>::top():empty stack");
}
return elems.back();
}
template<typename T,template<typename,typename>class CONT>
template<typename T2,template<typename,typename> class CONT2>
Stack<T,CONT> &Stack<T,CONT>::operator=(Stack<T2,CONT2> const&op2)
{
if((void*)this==(void*)&op2)
return*this;
Stack<T2,CONT2>tem(op2);
elems.clear();
while(!tem.empty())
{
elems.push_front(tem.top());
tem.pop();
}
return *this;
}

int main()
{
try
{
Stack<int> intStack;
Stack<float> floatStack;
intStack.push(42);
intStack.push(7);
floatStack.push(7.7);
floatStack=intStack;
std::cout<<floatStack.top()<<std::endl;
floatStack.pop();
std::cout<<floatStack.top()<<std::endl;
floatStack.pop();
std::cout<<floatStack.top()<<std::endl;
floatStack.pop();
}
catch(std::exception const& e)
{
std::cerr<<"exception:"<<e.what()<<std::endl;
}
}
qianyong325 2005-04-08
  • 打赏
  • 举报
回复
你先检查一下你的代码是不是少了","或者之类的东西,另外vc6.0偏特化都不支持,不知道的的代码支持不

64,637

社区成员

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

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