我有以下代碼:顯式調用operator <<的模板超載給出錯誤
//.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);
}
我使用VC++ 17。 我上線以下錯誤在.cpp文件的功能:
Rules.cpp(21): error C2677: binary '<': no global operator found which takes type 'UIDCategory' (or there is no acceptable conversion)
我一直在網上搜索了一個解決方案,我發現該template
關鍵字是必要的,調用operator<< <UIDCategory::GoodType>(goodRatio.goodType)
到表示operator<<
實際上是一個模板,所以我按照所示添加它,但錯誤不會消失。我在這裏做錯了什麼?
這裏的整個想法是爲typedef不引入新類型並因此不能在重載解析中使用的限制提供解決方法。當我簡單介紹以下超載時,我遇到了麻煩:std::ostream& operator<<(std::ostream& str, const GoodType& goodType)
。此標題相當於std::ostream& operator<<(std::ostream& str, const unsigned short& goodType)
,所以str << aGoodType
不明確(與std
中的標題衝突)。
我的代碼是企圖使用戶能夠明確說明什麼< <運營商的「超載」是通過使< <運營商的模板超載,然後明確地專注它的UIDCategory
不同成員使用。
我很感激任何關於錯誤和我試圖實現的事情的幫助。
您應該提供[MCVE]。 – Jonas