2017-07-27 2 views
-1

Je le code suivant:Explicitement appeler la surcharge de l'opérateur << basé sur un modèle donne l'erreur

//.hpp 
enum class UIDCategory 
{ 
    GoodType //and others 
}; 
typedef unsigned short UID; 
typedef UID GoodType; 

template<UIDCategory UIDCat> //Yes, UIDCat is supposed to go unused 
inline std::ostream& operator<<(std::ostream& str, const UID& uid) 
{ 
    return str << uid; 
} 

std::ostream& operator<<(std::ostream& str, const Recipe::GoodRatio& goodRatio); 

//definition of Rules here 

template<> 
inline std::ostream& operator<< <UIDCategory::GoodType>(std::ostream& str, const GoodType& goodType) 
{ 
    return str << Rules::goods.at(goodType); 
} 

//.cpp 
std::ostream& operator<<(std::ostream& str, const Recipe::GoodRatio& goodRatio) 
{ 
    return str.template operator<< <UIDCategory::GoodType>(goodRatio.goodType); 
} 

J'utilise VC++ 17. Je reçois l'erreur suivante sur la ligne dans la fonction dans le fichier .cpp:

Rules.cpp(21): error C2677: binary '<': no global operator found which takes type 'UIDCategory' (or there is no acceptable conversion) 

Je suis à la recherche d'une solution et je trouve que le mot-clé template est nécessaire dans l'appel à operator<< <UIDCategory::GoodType>(goodRatio.goodType) à dénote que operator<< est en fait un modèle, donc je l'ai ajouté comme indiqué, mais l'erreur ne disparaît pas. Qu'est-ce que je fais mal ici?

L'idée ici est de fournir une solution de rechange à la limitation selon laquelle les typedefs n'introduisent pas un nouveau type et ne peuvent donc pas être utilisés dans la résolution de surcharge. J'ai rencontré des problèmes lorsque j'ai simplement introduit la surcharge suivante: std::ostream& operator<<(std::ostream& str, const GoodType& goodType). Cet en-tête est équivalent à std::ostream& operator<<(std::ostream& str, const unsigned short& goodType) et donc str << aGoodType est ambigu (il se heurte à celui de).

Mon code est une tentative pour permettre à l'utilisateur d'indiquer explicitement ce « surcharge » de l'< opérateur < doit être utilisé en faisant une surcharge basé sur un modèle du < opérateur < et spécialisé explicitement pour les différents membres de UIDCategory .

J'apprécierais n'importe quelle aide sur l'erreur et sur la chose que j'essaye d'accomplir.

+1

Vous devez fournir un [MCVE]. – Jonas

Répondre

1

Tout en faisant mon exemple Minimal, complet et vérifiable comme suggéré par Jonas j'ai effectivement résolu le problème. Le problème était que j'utilisais la mauvaise convention d'appel de l'opérateur < <. Je l'ai appelé comme si c'était un membre du flux alors que ce n'est pas le cas. Il devrait donc être operator<<<UIDCategory::GoodType>(str, goodRatio.goodType) au lieu de str.template operator<< <UIDCategory::GoodType>(goodRatio.goodType).

J'ai aussi décidé que c'était de toute façon alambiqué pour ce que j'essayais de réaliser et j'ai choisi une méthode plus simple avec quelques inconvénients mineurs.