【问题标题】:template template argument - type/value mismatch error模板模板参数 - 类型/值不匹配错误
【发布时间】:2012-04-07 21:22:44
【问题描述】:

这是一个示例代码:

#include <stack>
#include <cstddef>

template <std::size_t N,
         template <class> class Stack = std::stack
         >   
class Tower : protected Stack<int>
{   
    public:
        Tower() : Stack<int>(N)
        {   
        }   
};  


int main(int argc, char **argv)
{   
    Tower<5L> tower1();
} 

而且我看到编译器 (gcc) 不高兴:

file.cpp: In function 'int main(int, char**)':
file.cpp:18:11: error: type/value mismatch at argument 2 in template parameter 
list for 'template<long unsigned int N, template<class> class Stack> class Tower'
file.cpp:18:11: error: expected a template of type 'template<class> class Stack',
got 'template<class _Tp, class _Sequence> class std::stack'
file.cpp:18:21: error: invalid type in declaration before ';' token

标准栈容器有这种形式:

template &lt;class Type, class Container = deque&lt;Type&gt; &gt; class stack;

意思是我应该可以在这里只传递一个模板参数!

关于如何解决这个问题的任何想法? 谢谢

【问题讨论】:

    标签: c++ class templates


    【解决方案1】:

    'template<class> class Stack', got 'template<class _Tp, class _Sequence> class std::stack' 显示问题。

    这是std::stack 的样子

    template<
        class T,
        class Container = std::deque<T>
    > class stack;
    

    如您所见,还有第二个参数。

    添加:

    #include <deque>
    template <std::size_t N,
             template <class T, class = std::deque<T>> class Stack = std::stack
             >   
    

    应该让它编译。

    【讨论】:

      【解决方案2】:

      std::stack 有多个模板参数。因此,它不能用于您的情况。您可以在 C++11 中使用 template typedefs 解决这个问题。

      template <typename T>
      using stack_with_one_type_parameter = std::stack<T>;
      
      template <std::size_t N,
           template <class> class Stack = stack_with_one_type_parameter
           >
      class Tower;
      

      【讨论】:

        【解决方案3】:

        谢谢,效果很好。这是对我的代码的修改:

        #include <stack>
        #include <queue>
        #include <cstddef>
        
        template <std::size_t N,
                 class T,
                 template <class, class> class Stack = std::stack,
                 class C = std::deque<T>
                 >   
        class Tower : protected Stack<T,C>
        {   
            public:
                Tower() : Stack<T,C>(N)
                {   
                }   
        };  
        
        
        int main(int argc, char **argv)
        {   
            Tower<5UL, int> tower1();
            Tower<5UL, int, std::queue> tower2();
            Tower<5UL, int, std::stack, std::deque<int> > tower3();
        }   
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-02
          • 2017-10-31
          相关资源
          最近更新 更多