运算符<<(&)用于模板类

时间:2010-07-18 16:30:31

标签: c++ templates

我想为我自己的类(也是模板)重载operator <<()。我的课程如下:

template<
    typename RefCountType,
    typename TraitsType = std::char_traits<char>,
    typename Allocator = std::allocator<typename TraitsType::char_type>
>
class rep {
    // ...
};

template<typename RepType>
class t_zstring {
    // ...
};

operator<<()的代码是:

template<
  typename CharType,
  typename TraitsType,
  typename Allocator,
  typename RefCountType,
  template<class,class,class> class RepType
>
inline std::basic_ostream<CharType,TraitsType>&
operator<<( std::basic_ostream<CharType,TraitsType> &os,
            t_zstring< RepType<RefCountType,TraitsType,Allocator> > const &s ) {
  return os << s.c_str();
}

模板代码编译得很好;但是,当我尝试使用它时(使用my_ref_count类的代码省略):

typedef rep<my_ref_count> my_rep;
typedef t_zstring<my_rep> zstring;
zstring z;
cout << z; // ztest.cpp, line 201

我得到(使用g ++ 4.2.1):

ztest.cpp:201: error: no match for ‘operator<<’ in ‘std::cout << z1’

如何正确声明我的operator<<(),以便编译器找到正确的匹配?

1 个答案:

答案 0 :(得分:0)

如果要定义&lt;&lt;类t_zstring的运算符,我认为写起来更容易:

template<typename OS, typename RepType>
OS& operator<<(OS &os, t_zstring<RepType> const &s ) 
{ 
  return os << s.c_str();
}