2017-07-27 72 views
-1

我有以下代碼:顯式調用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不同成員使用。

我很感激任何關於錯誤和我試圖實現的事情的幫助。

+1

您應該提供[MCVE]。 – Jonas

回答

1

雖然使我的最小,完整和可驗證的例子,由喬納斯建議我實際上解決了這個問題。問題在於我使用了錯誤的調用約定,運算符是< <。 我把它稱爲它是流的成員,但它不是。 所以它應該是operator<<<UIDCategory::GoodType>(str, goodRatio.goodType)而不是str.template operator<< <UIDCategory::GoodType>(goodRatio.goodType)

此外,我決定,無論如何,這是我想要實現的方法,並選擇了一些簡單的方法,但有一些小缺點。