模板模板参数 - 编译错误

时间:2011-10-31 20:22:45

标签: c++ templates

我尝试从David Vandevoorde和Nicolai M. Josuttis的“C ++模板 - 完整指南”中编译以下代码示例:

    #include <iostream>
    #include <deque>
    #include <vector>
    #include <stdexcept>
    #include <memory>

    template < typename T, 
               template < typename ELEM, typename = std::allocator< ELEM > > 
                          class CONT = std::deque >
    class ourstack
    {
    private:
        CONT< T > elems;
    public:
        void push( T const& );
        void pop();
        T top() const;
        bool empty() const
        { return elems.empty(); }
        template < typename T2 >
                template < typename ELEM2, 
                           typename = std::allocator< ELEM2 > > class CONT2 >
        ourstack< T, CONT >& operator = ( ourstack< T2, CONT2 > const & );
    };

    template < typename T, 
               template < typename, typename > class CONT >
    void ourstack< T, CONT>::push( T const& elem )
    {
        elems.push_back( elem );
    }

    template < typename T, 
               template < typename, typename > class CONT >
    void ourstack< T, CONT>::pop()
    {
        if ( elems.empty() )
        {
            throw std::out_of_range( "Stack empty" );
        }
        elems.pop_back();
    }

    template < typename T, 
               template < typename, typename > class CONT >
    void ourstack< T, CONT>::top() const
    {
        if ( elems.empty() )
        {
            throw std::out_of_range( "Stack empty" );
        }
        return elems.back();
    }

    template < typename T, 
               template < typename, typename > class CONT >
        template < typename T2 >
                   template < typename, typename > class CONT2 >
    ourstack< T, CONT >& ourstack< T, CONT >::operator = ( ourstack< T2, CONT2 > const & op2    )
    {
        if (( void*) this == (void*) op2 )
        {
            return *this;
        }
        ourstack< T2 > tmp( op2 );
        elems.clear();
        while ( !tmp.empty() )
        {
            elems.push_front( tmp.top() );
            tmp.pop();
        }
        return *this;
    }

    int main( int argc, char* argv[] )
    {
        ourstack< int > s;
        return 0;
    }

但是

我正在使用gcc版本4.4.3。

编译器写消息:

    g++ -Wall template_of_template.cpp -o template_of_template 
    template_of_template.cpp:22: error: too many template-parameter-lists
template_of_template.cpp:22: error: expected unqualified-id before ‘>’ token
template_of_template.cpp:46: error: prototype for ‘void ourstack<T, CONT>::top() const’ does not match any in class ‘ourstack<T, CONT>’
template_of_template.cpp:17: error: candidate is: T ourstack<T, CONT>::top() const
template_of_template.cpp:58: error: too many template-parameter-lists
template_of_template.cpp:58: error: expected unqualified-id before ‘>’ token

有什么问题?

2 个答案:

答案 0 :(得分:3)

代码的唯一问题是您需要学习更准确地输入。 ; - ]

修复了多个拼写错误(t而不是r>而不是,)后,处于可编辑状态的代码相同:

#include <iostream>
#include <deque>
#include <vector>
#include <stdexcept>
#include <memory>

template < typename T, 
           template < typename ELEM,
                      typename = std::allocator< ELEM > > class CONT = std::deque >
class ourstack
{
private:
    CONT< T > elems;
public:
    void push( T const& );
    void pop();
    T top() const;

    bool empty() const
    { return elems.empty(); }

    template < typename T2,
               template < typename ELEM2,
                          typename = std::allocator< ELEM2 > > class CONT2 >
    ourstack< T, CONT >& operator = ( ourstack< T2, CONT2 > const & );
};

template < typename T, 
           template < typename, typename > class CONT >
void ourstack< T, CONT>::push( T const& elem )
{
    elems.push_back( elem );
}

template < typename T, 
           template < typename, typename > class CONT >
void ourstack< T, CONT>::pop()
{
    if ( elems.empty() )
    {
        throw std::out_of_range( "Stack empty" );
    }
    elems.pop_back();
}

template < typename T, 
           template < typename, typename > class CONT >
T ourstack< T, CONT>::top() const
{
    if ( elems.empty() )
    {
        throw std::out_of_range( "Stack empty" );
    }
    return elems.back();
}

template < typename T, 
           template < typename, typename > class CONT >
template < typename T2,
           template < typename, typename > class CONT2 >
ourstack< T, CONT >& ourstack< T, CONT >::operator = ( ourstack< T2, CONT2 > const & op2    )
{
    if (( void*) this == (void*) op2 )
    {
        return *this;
    }
    ourstack< T2 > tmp( op2 );
    elems.clear();
    while ( !tmp.empty() )
    {
        elems.push_front( tmp.top() );
        tmp.pop();
    }
    return *this;
}

int main( int argc, char* argv[] )
{
    ourstack< int > s;
    return 0;
}

答案 1 :(得分:1)

    template < typename T2 >
            template < typename ELEM2, 
                       typename = std::allocator< ELEM2 > > class CONT2 >
    ourstack< T, CONT >& operator = ( ourstack< T2, CONT2 > const & );

那里有两个template声明,其中只应该有一个声明。我不确定,但我认为你想要的是这个:

    template <
        typename T2
      , template < typename ELEM2, typename = std::allocator< ELEM2 > > class CONT2
    >
    ourstack< T, CONT >& operator = ( ourstack< T2, CONT2 > const & );

另请注意,为模板模板参数提供名称毫无意义。