【问题标题】:Template Template Parameters - compile error模板模板参数 - 编译错误
【发布时间】:2011-10-31 20:22:44
【问题描述】:

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

有什么问题?

【问题讨论】:

  • 你同时使用outstackourstack...

标签: c++ templates


【解决方案1】:

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

修复多个拼写错误(t 代替 r&gt; 代替 ,)后,下面是处于可编译状态的相同代码:

#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;
}

【讨论】:

    【解决方案2】:
        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 & );
    

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

    【讨论】:

      猜你喜欢
      • 2020-10-13
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-09
      • 2017-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多