2013-06-12 93 views
12

代码:默认参数类封闭

template <typename element_type, typename container_type = std::deque<element_type> > 
class stack 
{ 
    public: 
     stack() {} 
     template <typename CT> 
     stack(CT temp) : container(temp.begin(), temp.end()) {} 
     bool empty(); 
    private: 
     container_type container; 
}; 

template <typename element_type, typename container_type = std::deque<element_type> > 
bool stack<element_type, container_type>::empty() 
{ 
    return container.empty(); 
} 

当我编译它给人的错误。对于类封闭'bool stack<element_type,container_type>::empty()'

为什么编译器抱怨,我怎样才能使它发挥作用的模板参数

默认参数?

+0

这是真的完整的错误信息吗?它看起来像缺少一些东西... –

+0

@TimoGeusch:它的确用g ++和'--std = C++ 0x'编译。虽然实际上是正确的,但乍一看并不是很有帮助:/ –

回答

20

您尝试为第二模板参数stack默认参数两次。默认的模板参数,就像默认的函数参数一样,只能定义一次(每个翻译单元)。甚至不重复完全相同的定义是允许的。

在您定义的类模板开始只需键入默认参数。之后,将其忽略:

template<typename element_type,typename container_type> 
bool stack<element_type,container_type>::empty(){ 
    return container.empty(); 
} 
+0

非常感谢你,它的工作原理 – huals

2

该默认参数,通过语法,默认参数的类,它才有意义,在类的声明。

如果你想调用该函数...

stack<foo,bar>().empty(); 

你只有类的名称,以便您已经在模板类声明的时候提供的默认参数的网站上的模板参数。

您可以通过简单地从函数定义中删除默认的参数解决该问题:

template<typename element_type,typename container_type> 
bool stack<element_type,container_type>::empty(){ 
    return container.empty(); 
} 
+0

你是对的,非常感谢你! – huals