Я хотел бы определить оператора ostream, чтобы позволить мне легко выводить переменные типа alglib::complex
. Чтобы предоставить рабочий пример без включения библиотеки alglib, я вместо этого перегружу вывод complex<double>
(это пояснение из-за более ранней версии вопроса). В заголовочном файле «my_class.h» Я имеюФункция друга, определяющая оператор ostream
using namespace std;
#include <complex>
#include <iostream>
class my_class {
public:
ostream& operator << (std::ostream& os, complex<double> a) {
os << "(" << real(a) << "," << imag(a) << ")";
return os;
}
void output(complex<double>);
my_class() {}
~my_class() {}
};
И в исходном файле «my_class.cpp» У меня есть
#include "my_class.h"
void my_class::output(complex<double> cd) {
cout << cd << endl;
}
Наконец у меня есть основной файл метод «run_my_class.cpp»:
#include "my_class.h"
int main(int argc, const char* argv[]) {
my_class obj;
complex<double> cd=complex<double>(1.0,-1.0);
obj.output(cd);
}
Я пытаюсь скомпилировать с помощью
g++ -c my_class.cpp
, но это дает мне ошибку
my_class.h:9:62: error: ‘std::ostream& my_class::operator<<(std::ostream&, std::complex<double>)’ must take exactly one argument
ostream& operator << (std::ostream& os, complex<double> a) {
Однако, если определить оператор как друг, а именно friend ostream& operator << (std::ostream& os, complex<double> a)
, он собирает и компилировать основной метод:
g++ run_my_class.cpp my_class.o -o run_my_class
И это работает, как должны , Однако это не то, на что похоже ключевое слово friend
. Есть ли лучший способ сделать эту работу?
Почему вы делаете оператор вывода другом класса 'my_class'? Вы даже не используете 'my_class' в функциях? –
Ошибка почти звучит так, как будто для аргументов не найден жизнеспособный 'operator <<', и вместо этого использовался оператор free rvalue-ref forwarder '(basic_ostream <..> &&, T const &)'. Предоставьте [MCVE] (http://stackoverflow.com/help/MCVE) соответствующий контекст. – dyp
@JoachimPileborg Чтобы класс мог использовать оператор ostream. Я не мог заставить его сработать без «друга». Но может быть, есть лучший способ? – jorgen