重载运算符<< C ++;未定义的引用`std :: basic_ostream

时间:2012-09-08 15:38:30

标签: c++ g++ operator-overloading undefined

我正在尝试重载运算符<<在我的代码中。如果我注释掉我试图使用<<运算符与我的自定义类,它编译好。该错误几乎看起来不像c ++库(?)。

我对这个问题的所有研究都表明这是一个链接问题。大多数建议使用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 个答案:

答案 0 :(得分: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;
}

这是用clang,g ++和ideone

编译的

为了解释这个问题,编译器正在查看以下定义的链接时间:

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

如果您只有以下定义:

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

这是因为您的原型(明确的和朋友)与您的定义之间的沟通错误。