2012-09-08 129 views
2

我想在我的代碼中超載運算符< <。如果我註釋掉我嘗試在我的自定義類中使用<運算符的行,它編譯得很好。該錯誤幾乎看起來像它不喜歡C++庫(?)。重載運算符<< C++;未定義的參考`std :: basic_ostream

我對這個問題的所有研究都表明它是一個鏈接問題。大多數人建議使用g ++而不是gcc。我正在使用g ++作爲我的編譯器,並且仍然出現此錯誤。

代碼:

#include <iostream> 
using namespace std; 

//prototype the class and the functions 
template<class T> class strange; 
template<class T> ostream& operator<< (ostream& osObject, strange<T>& sObject); 


//begin class 
template <class T> 
class strange 
{ 
    public: 
     // .... function prototypes go here. 
      strange(T x,T y); 
      friend ostream& operator<< <> (ostream& osObject, strange<T>& sObject); 

    private: 
    T a; 
    T b; 
}; 
// .... your function definitions go here 
template <class T> 
     strange<T>::strange(T first, T second){ 
     a = first; 
     b = second; 
} 

template <class T> 
ostream& operator<< (ostream& osObject, const strange<T>& sObject){ 
     osObject << sObject.a << ", " << sObject.b; 
     return osObject; 
} 



int main() 
{ 
    strange<int> x1(4,6) , x2(12,2) ; 
    //strange<char> y1('m','n') , y2('m','n') ; 
    cout << "x1 = " << x1 << endl; 
    return 0; 
} 

錯誤:

test.cpp:(.text+0x7a): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& operator<< <int>(std::basic_ostream<char, std::char_traits<char> >&, strange<int>&)' 
collect2: ld returned 1 exit status 

任何想法是什麼原因造成的?

+1

難道你的操作符定義是在'.cpp'文件中,而不是在頭部? – juanchopanza

+0

不會 '#包括;' 和 'using namespace std;' 照顧(ostream&)? – Jeff

+0

不,您的*模板代碼必須通過包含來訪問。 – juanchopanza

回答

4

我做了兩個改變,一個是朋友定義,另一個是原型。這應該編譯:

#include <iostream> 
using namespace std; 

//prototype the class and the functions 
template<class T> class strange; 
template<class T> ostream& operator<< (ostream& osObject, const strange<T>& sObject); 


//begin class 
template <class T> 
class strange 
{ 
    public: 
     // .... function prototypes go here. 
      strange(T x,T y); 
      friend ostream& operator<< <> (ostream& osObject, const strange<T>& sObject); 

    private: 
    T a; 
    T b; 
}; 
// .... your function definitions go here 
template <class T> 
     strange<T>::strange(T first, T second){ 
     a = first; 
     b = second; 
} 

template <class T> 
ostream& operator<< (ostream& osObject, const strange<T>& sObject){ 
     osObject << sObject.a << ", " << sObject.b; 
     return osObject; 
} 



int main() 
{ 
    strange<int> x1(4,6) , x2(12,2) ; 
    //strange<char> y1('m','n') , y2('m','n') ; 
    cout << "x1 = " << x1 << endl; 
    return 0; 
} 

這將編譯鐺,g ++以及在ideone

爲了說明問題,編譯器正在尋找在鏈接時的定義:

std::ostream & operator<< <int>(std::ostream &, strange<int>&); 

當你只有一個定義:

std::ostream & operator<< <int>(std::ostream &, strange<int> const &); 

這是因爲m你的原型(明確的和朋友)和你的定義之間的溝通。

+0

立即嘗試......「在課堂以外使用的朋友」 – Jeff

+0

我指的是第16行。 –

+0

奇怪。用clang編譯,而不用g ++。再給我幾分鐘。 –

相關問題