【发布时间】:2015-10-11 11:52:15
【问题描述】:
我想定义一个 ostream 运算符,让我轻松输出alglib::complex 类型的变量。为了提供一个不包括 alglib 库的工作示例,我将在下面重载 complex<double> 的输出(由于问题的早期版本,此澄清)。在头文件“my_class.h”中我有
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),它会编译并且我编译 main 方法:
g++ run_my_class.cpp my_class.o -o run_my_class
它可以正常工作。然而,这似乎不是 friend 关键字的用途。有没有更好的方法来完成这项工作?
【问题讨论】:
-
为什么要让输出运算符成为
my_class类的朋友?你甚至没有在函数中使用my_class? -
这个错误听起来好像没有为参数找到可行的
operator <<,而是使用了免费的右值引用转发器operator<< (basic_ostream<..>&&, T const&)。请提供具有适当上下文的MCVE。 -
@JoachimPileborg 这样该类就可以使用 ostream 运算符。没有
friend,我无法编译它。但也许有更好的方法? -
反之亦然:如果函数使用类的私有成员,则必须声明类的函数
friend -
如果您向我们展示原始问题可能会有所帮助
标签: c++ class operators friend ostream