我尝试从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
有什么问题?
答案 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 & );
另请注意,为模板模板参数提供名称毫无意义。