2010-07-18 2 views
1

Je veux surcharger operator <<() pour ma propre classe qui est également un modèle. Mes cours sont les suivantes:operator <<() pour la classe de modèle

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 { 
    // ... 
}; 

Le code pour operator<<() est:

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(); 
} 

Le code du modèle compile très bien; Cependant, lorsque je tente de l'utiliser comme (avec le code de la classe elided my_ref_count):

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

je reçois (en utilisant g ++ 4.2.1):

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

Comment puis-je déclarer mon operator<<() correctement afin que le compilateur trouve la bonne correspondance?

+0

Si pas 'l'opérateur <<()' prendre un seul paramètre? –

+1

@klez - non, puisque 'operator <<' est une fonction libre ici, il a besoin de deux paramètres. –

+0

@R Samuel Klatchko, parfait, maintenant je suis encore plus sûr que je ne connais pas bien le C++: D –

Répondre

0

Si vous souhaitez définir l'opérateur < < pour t_zstring de classe, je pense qu'il est plus facile d'écrire:

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

Sauf que cela ne limite pas le type d'OS à être un std :: basic_ostream –

+0

Oui, vous avez raison Comme vous avez suggéré que g ++ 4.2.1 peut être cassé, je pensais qu'une déclaration plus facile pourrait le résoudre Après tout, restreindre OS à std :: basic_ostream n'est pas toujours nécessaire. –

Questions connexes