2015-11-01 66 views
1

我想在我的模板類重載運營商<<和 我得到錯誤的位置,我想友元函數和錯誤LNK2019

NSizeNatural<30> a(101); 
cout << a; 

沒有這整個程序編譯

錯誤:

error LNK2019: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<<30,unsigned int,unsigned __int64,10>(class std::basic_ostream<char,struct std::char_traits<char> > &,class NSizeNatural<30,unsigned int,unsigned __int64,10> const &)" ([email protected][email protected]@[email protected][email protected]@[email protected]@@[email protected]@[email protected]? [email protected][email protected][email protected]@@Z) referenced in function _main 

Numbers.h文件:

template<int size, typename basic_type = unsigned int, typename long_type = unsigned long long, long_type base = bases(DEC)> 
class NSizeNatural 
{ 
     // this is how I decelerate friend function 
    friend ostream& operator<<(ostream& str, const NSizeNatural<size, basic_type, long_type, base> & n); 
} 

Numbers.cpp文件:

template<int size, typename basic_type, typename long_type, long_type base> 
std::ostream& operator<<(std::ostream& out, const NSizeNatural<size, basic_type, long_type, base> &y) 
{ 
    // For now i want to have my code compile-able 
    return out << "gg"; 
} 


我不知道如何正確地做到這一點。在哪裏是一個bug ...

+1

簡短的回答:你必須移動運營商<<''的實施到'號.h',這樣當'main'調用這個操作符時,編譯器就可以使用它了。 –

+1

好吧,它有助於錯誤LNK2019,所以謝謝。一個不要多麼錯過!當然,運營商的模板意味着它的模板,應該在.h文件中.... 但現在我錯誤'運營商<<'是不明確的? – Yurrili

回答

2

你的代碼中有兩個問題,第一個問題是,你應該將operator <<的實現移動到頭文件中(如你的問題的註釋)。

但是,第二個問題是您的friendoperator <<定義,則必須將其定義爲一個模板函數沒有默認參數:

template<int size, typename basic_type = unsigned int, typename long_type = unsigned long long, long_type base = bases(DEC)> 
class NSizeNatural 
{ 
    template<int size1, typename basic_type1, typename long_type1, long_type base1> 
    friend ostream& operator<< (ostream& str, const NSizeNatural<size, basic_type, long_type, base> & n); 
}; 
+0

是的,現在我知道了。幾分鐘前我解決了我的問題,但感謝您的回答。 :) – Yurrili