繁体   English   中英

模板模板参数-编译错误

[英]Template Template Parameters - compile error

我尝试从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

有什么问题 ?

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

修正了多个拼写错误(用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;
}
    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 & );

还要注意,为模板模板参数提供名称没有意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM