对于我自己的班级,操作员<<不能超载

时间:2019-01-02 01:05:46

标签: c++ qt

我正在尝试使用输出运算符对流而不是打印函数的重载来减少代码冗余。

//***.h
class MainWind : public QWidget
{
    Q_OBJECT

public:
    explicit MainWind(QWidget *parent = nullptr);
    ~MainWind();
    MainWind *operator<<(const QString &str);
private:
    Ui::MainWind *ui;
};

//***.cpp
MainWind *MainWind::operator<<(const QString &str)
{
    ui->serverConsole->insertPlainText(str);
    return this;
}

此刻,一切都可以成功编译。

但是当我尝试使用时:

//other.cpp
MainWind *mainWind  = new MainWind;
mainWind << QString("str");

我收到此错误:

  

ServerSocket.cpp:39:错误:对二进制表达式无效的操作数   (“ MainWind *”和“ QString”)   qstring.h:1410:候选函数不可行:第一个参数从>'MainWind *'到'QDataStream&'的未知转换

     

...

     

这个职位有很多候选人)

//other.cpp
MainWind *mainWind  = new MainWind;
mainWind <<"str";

我收到此错误:

  

ServerSocket.cpp:39:错误:对二进制表达式无效的操作数   (“ MainWind *”和“ const char [4]”)ServerSocket.cpp:39:错误:   类型'MainWind *'和'const char [4]'的无效操作数为二进制   '运算符<<'            CurrentSession :: inst()。mainWind()<<“ str”;

                                                  ^

可能是什么问题?

此问题的补充:

尝试使用:

//*.h
friend MainWind *operator<<(MainWind *out,QString &str);

//***.cpp
MainWind * operator<<(MainWind *out, QString &str)
{
    out->ui->serverConsole->insertPlainText(str);
    return out;
}

以前的代码编译成功。

根据这个想法,如果第一个操作数不能是指针,则此代码将无法编译...

但是使用此功能时:

//other.cpp
MainWind *mW = new MainWind;
mW << "str";

编译出错:

  

ServerSocket.cpp:37:错误:类型'MainWind *'和'const char [4]'的无效操作数对二进制'operator <<'                   mW <<“ str”;

                ^

3 个答案:

答案 0 :(得分:5)

您需要使用*mainWind << QString("str");。 LHS必须是一个对象,而不是指针。

与此同时,我强烈建议更改operator<<函数以返回对该对象的引用,而不是指针。

MainWind& operator<<(const QString &str);

及其实现

MainWind& MainWind::operator<<(const QString &str)
{
    ui->serverConsole->insertPlainText(str);
    return *this;
}

这将允许您链接运算符。

*mainWind << QString("str") << QString("Second string");

答案 1 :(得分:3)

您在i而不是<<MainWnd超载了。

MainWnd*

您还想要*mainWind << QString("str");

答案 2 :(得分:1)

//other.cpp
MainWind *mainWind  = new MainWind;
mainWind <<"str";

原因是mainWind << "str"寻找一个接受两个参数的operator<<(),第一个参数是MainWind *

因此,您已经定义了一个MainWind::operator<<(),它的第一个参数称为MainWind &。没有从MainWind *MainWind &(或MainWind)的直接转换。因此出现错误消息。

获得编译代码的一种方法是将mainWind <<"str"更改为*mainWind << "str"*取消对指针的引用,并产生一个引用,这就是您的operator<<()所期望的。

然后就是了

*mainWind << "str" << "another str";

将无法编译,因为它等效于

(*mainWind).operator<<("str") << "another str";

其中(*mainWind).operator<<("str")返回一个MainWind *。尝试流式"another str"时,这会再次引起相同的问题。

真正的解决方法是更改​​operator<<(),使其返回引用

//  within the class definition of MainWind

MainWind &operator<<(const QString &str);

// definition of the operator<<()

MainWind &MainWind::operator<<(const QString &str)
{
    ui->serverConsole->insertPlainText(str);
    return *this;
}

并将调用代码更改为任一

//other.cpp version 2

MainWind *mainWind  = new MainWind;
*mainWind <<"str";

// this will work too

*mainWind << "str" << "another str";  

//   note reliance on cleaning up mainWind to avoid a memory leak

delete mainWind;   

没有其他修复方法可让您使用mainWind << "str",因为仅在类或枚举类型上允许重载非成员operator<<(),而在指针上不允许。