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.
Vous devez fournir un [MCVE]. – Jonas