<>书的源代码编译不过,为什么?解决方案
<<C++ Template>>书的源代码编译不过,为什么?
这本书的随书源代码,我在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>根本就没有用到啊
------解决方案--------------------
读书还得再认真一点,下面是摘抄 c++-templates 的原话,就在主楼例子程序下面不远。
If you try to use the new version of Stack , you get an error message saying that the default value std::deque is not compatible with the template template parameter CONT. The problem is that a template template argument must be a template with parameters that exactly match the parameters of the template template parameter it substitutes. Default template arguments of template template arguments are not considered, so that a match cannot be achieved by leaving out arguments that have default values.
The problem in this example is that the std::deque template of the standard library has more than one parameter: The second parameter (which describes a so-called allocator) has a default value, but this is not considered when matching std::deque to the CONT parameter.
再往下该书给出了一个能编译的程序。
------解决方案--------------------
http://topic.****.net/u/20120603/07/53a28ade-c1c1-4a02-9576-4cca490d041c.html
这本书的随书源代码,我在VC10下面试验了一下,发现竟然编译不过:
- C/C++ code
#include<deque> template <typename T, template <typename ELEM> class CONT = std::deque >//编译器报错!!!!!!! class Stack { private: CONT<T> elems; // elements public: void push(T const&); // push element void pop(); // pop element T top() const; // return top element bool empty() const { // return whether the stack is empty return elems.empty(); } }; template <typename T, template <typename> class CONT> void Stack<T,CONT>::push (T const& elem) { elems.push_back(elem); // append copy of passed elem } template<typename T, template <typename> class CONT> void Stack<T,CONT>::pop () { if (elems.empty()) { throw std::out_of_range("Stack<>::pop(): empty stack"); } elems.pop_back(); // remove last element } template <typename T, template <typename> class CONT> T Stack<T,CONT>::top () const { if (elems.empty()) { throw std::out_of_range("Stack<>::top(): empty stack"); } return elems.back(); // return copy of last element } int _tmain(int argc, _TCHAR* argv[]) { return 0; }
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>根本就没有用到啊
------解决方案--------------------
读书还得再认真一点,下面是摘抄 c++-templates 的原话,就在主楼例子程序下面不远。
If you try to use the new version of Stack , you get an error message saying that the default value std::deque is not compatible with the template template parameter CONT. The problem is that a template template argument must be a template with parameters that exactly match the parameters of the template template parameter it substitutes. Default template arguments of template template arguments are not considered, so that a match cannot be achieved by leaving out arguments that have default values.
The problem in this example is that the std::deque template of the standard library has more than one parameter: The second parameter (which describes a so-called allocator) has a default value, but this is not considered when matching std::deque to the CONT parameter.
再往下该书给出了一个能编译的程序。
------解决方案--------------------
http://topic.****.net/u/20120603/07/53a28ade-c1c1-4a02-9576-4cca490d041c.html