3

サンプルコードは次のとおりです。

#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 <class Type, class Container = deque<Type> > class stack;

つまり、ここでテンプレート引数を1つだけ渡しても問題ありません。

これを解決する方法について何か考えはありますか?ありがとう

4

3 に答える 3

4

'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;

ご覧のとおり、2番目のパラメーターがあります。

追加:

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

コンパイルする必要があります。

于 2012-04-07T21:31:45.580 に答える
4

std::stack複数のテンプレート引数があります。したがって、あなたの場合には使用できません。テンプレートtypedefsを使用してC++11でこれを回避できます。

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;
于 2012-04-07T21:34:02.607 に答える
2

おかげで、それはうまくいきました。動作する私のコードの変更は次のとおりです。

#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();
}   
于 2012-04-08T12:34:10.673 に答える