g ++ — оператор перегрузки & lt; & lt; C ++; неопределенная ссылка на `std :: basic_ostream

Я пытаюсь перегрузить оператора<< в моем коде. Если я закомментирую строки, где я пытаюсь использовать << Оператор с моим пользовательским классом, он прекрасно компилируется. Ошибка выглядит так, будто ей не нравятся библиотеки 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

Есть идеи, что вызывает это?

2

Решение

Я внес два изменения: одно в определение друга, а другое в прототип. Это должно скомпилировать:

#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 &);

Это из-за неправильной связи между вашими прототипами (как явным, так и другом) и вашим определением.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]