免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2167 | 回复: 8
打印 上一主题 下一主题

<<C++ Template>>书的源代码编译不过,为什么? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-02 19:28 |只看该作者 |倒序浏览
10可用积分
这本书的随书源代码,我在VC10下面试验了一下,发现竟然编译不过.
VC提示说: error C3201: the template parameter list for class template 'std::deque' does not match the template parameter list for template parameter 'CONT'
  
我想问,这里的模板写法:
template <typename ELEM> class CONT = std::deque
是否符合C++规范? 为什么要用到嵌套的template声明,<typename ELEM>根本就没有用到啊
--------------------------------------------------------------------------------

  1. #include<deque>
  2. template <typename T,
  3.            template <typename ELEM> class CONT = std::deque >//编译器报错!!!!!!!
  4. class Stack {
  5.    private:
  6.      CONT<T> elems;         // elements
  7.   
  8.    public:
  9.      void push(T const&);   // push element
  10.      void pop();            // pop element
  11.      T top() const;         // return top element
  12.      bool empty() const {   // return whether the stack is empty
  13.          return elems.empty();
  14.      }
  15. };
  16. template <typename T, template <typename> class CONT>
  17. void Stack<T,CONT>::push (T const& elem)
  18. {
  19.      elems.push_back(elem);    // append copy of passed elem
  20. }
  21.   
  22. template<typename T, template <typename> class CONT>
  23. void Stack<T,CONT>::pop ()
  24. {
  25.      if (elems.empty()) {
  26.          throw std::out_of_range("Stack<>::pop(): empty stack");
  27.      }
  28.      elems.pop_back();         // remove last element
  29. }
  30.   
  31. template <typename T, template <typename> class CONT>
  32. T Stack<T,CONT>::top () const
  33. {
  34.      if (elems.empty()) {
  35.          throw std::out_of_range("Stack<>::top(): empty stack");
  36.      }
  37.      return elems.back();      // return copy of last element
  38. }
  39.   
  40. int _tmain(int argc, _TCHAR* argv[])
  41. {
  42.      return 0;
  43. }
复制代码

最佳答案

查看完整内容

搞定了, deque 模板有两个参数,一个是Element,另外一个是 Alloc ,所以必须要带一个 Alloc

论坛徽章:
26
处女座
日期:2016-04-18 14:00:4515-16赛季CBA联赛之深圳
日期:2020-06-02 10:10:5015-16赛季CBA联赛之广夏
日期:2019-07-23 16:59:452016科比退役纪念章
日期:2019-06-26 16:59:1315-16赛季CBA联赛之天津
日期:2019-05-28 14:25:1915-16赛季CBA联赛之青岛
日期:2019-05-16 10:14:082016科比退役纪念章
日期:2019-01-11 14:44:062016科比退役纪念章
日期:2018-07-18 16:17:4015-16赛季CBA联赛之上海
日期:2017-08-22 18:18:5515-16赛季CBA联赛之江苏
日期:2017-08-04 17:00:4715-16赛季CBA联赛之佛山
日期:2017-02-20 18:21:1315-16赛季CBA联赛之天津
日期:2016-12-12 10:44:23
2 [报告]
发表于 2012-06-02 19:28 |只看该作者
本帖最后由 evaspring 于 2012-06-02 20:47 编辑

搞定了, deque 模板有两个参数,一个是Element,另外一个是 Alloc ,所以必须要带一个 Alloc

  1. #include <memory>
  2. #include <deque>
  3. template <typename T, typename A, template <typename ELEM, typename A> class CONT = std::deque >
  4. class Stack {
  5. private:
  6.         CONT<T,A> elems;         // elements

  7. public:
  8.         void push(T const&);   // push element
  9.         void pop();            // pop element
  10.         T top() const;         // return top element
  11.         bool empty() const {   // return whether the stack is empty
  12.                 return elems.empty();
  13.         }
  14. };
  15. template <typename T, typename A, template <typename, typename> class CONT>
  16. void Stack<T,A,CONT>::push (T const& elem)
  17. {
  18.         elems.push_back(elem);    // append copy of passed elem
  19. }

  20. template<typename T, typename A, template <typename, typename> class CONT>
  21. void Stack<T,A,CONT>::pop ()
  22. {
  23.         if (elems.empty()) {
  24.                 throw std::out_of_range("Stack<>::pop(): empty stack");
  25.         }
  26.         elems.pop_back();         // remove last element
  27. }

  28. template <typename T, typename A, template <typename, typename> class CONT>
  29. T Stack<T,A,CONT>::top () const
  30. {
  31.         if (elems.empty()) {
  32.                 throw std::out_of_range("Stack<>::top(): empty stack");
  33.         }
  34.         return elems.back();      // return copy of last element
  35. }

  36. int main(int argc, char* argv[])
  37. {
  38.         return 0;
  39. }

复制代码

论坛徽章:
26
处女座
日期:2016-04-18 14:00:4515-16赛季CBA联赛之深圳
日期:2020-06-02 10:10:5015-16赛季CBA联赛之广夏
日期:2019-07-23 16:59:452016科比退役纪念章
日期:2019-06-26 16:59:1315-16赛季CBA联赛之天津
日期:2019-05-28 14:25:1915-16赛季CBA联赛之青岛
日期:2019-05-16 10:14:082016科比退役纪念章
日期:2019-01-11 14:44:062016科比退役纪念章
日期:2018-07-18 16:17:4015-16赛季CBA联赛之上海
日期:2017-08-22 18:18:5515-16赛季CBA联赛之江苏
日期:2017-08-04 17:00:4715-16赛季CBA联赛之佛山
日期:2017-02-20 18:21:1315-16赛季CBA联赛之天津
日期:2016-12-12 10:44:23
3 [报告]
发表于 2012-06-02 20:37 |只看该作者
没搞定 g++ 也编译不过

gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC)

template.cpp:1: error: expected constructor, destructor, or type conversion before ‘<’ token

最近搞了下模板,发现 g++ 和 vc 差异很大,他们之间的版本对模板的支持程度差异也不小

论坛徽章:
0
4 [报告]
发表于 2012-06-02 20:37 |只看该作者
主要是因为VS的STL与GCC等STL实现上的一区别造成的。

VS好像是MS实现的,不知道哪个版本,GCC等一般用SGI的STL。

论坛徽章:
0
5 [报告]
发表于 2012-06-02 21:06 |只看该作者
回复 4# evaspring

std::deque 带有默认的Alloc ,编译器竟然识别不到?

使用在线编译器codepad(g++版本:g++ 4.1.2  flags:-std=c++98  ) 可以编译通过LZ的代码
   

论坛徽章:
0
6 [报告]
发表于 2012-06-03 10:48 |只看该作者
Moon_Bird 发表于 2012-06-02 21:06
回复 4# evaspring

std::deque 带有默认的Alloc ,编译器竟然识别不到?


多谢,你怎么知道codepad使用的是GCC4.1.2(而不是4.5,4.6,4.7)呢?

论坛徽章:
0
7 [报告]
发表于 2012-06-03 11:19 |只看该作者
回复 6# songweibo

http://codepad.org/about   这里有关于codepad的说明
   

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
8 [报告]
发表于 2012-06-03 13:41 |只看该作者
添加了头文件stdexcept,修改了TCHAR和_tmain以后,gcc4.7.0编译通过(默认C++11)。

论坛徽章:
0
9 [报告]
发表于 2012-06-04 09:35 |只看该作者
MS的版本是PJ Plauger 实现的. 这家伙写的版本是我见过所有版本里写的最烂的. 从效率到可读性都是最差的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP