错误:无法将“std::ostream {aka std::basic_ostream<char>}”左值绑定到“std::basic_ostream<char>&&”

error: cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'

提问人:Beccio-san 提问时间:3/24/2022 最后编辑:Solomon UckoBeccio-san 更新时间:3/24/2022 访问量:445

问:

所以,我最近在大学里学习了 c++ 的 OOP,我发现自己遇到了一些问题。 我尝试了超载,发现自己有一些问题需要解决。 首先,执行重载 as 会带来一个被描述为 的问题,所以,就像我删除的第二个参数一样。但是一旦我尝试构建以下代码,就会出现错误:. 我读了这个错误,但无法理解它,我该怎么办,我犯了什么错误?ostream operator << ostream& operator<<(ostream& outs, const Test&);\src\Test.h:15:48: error: 'std::ostream& test::Test::operator<<(std::ostream&, const test::Test&)' must take exactly one argument ostream& operator<<(ostream& outs, const Test&);operator ==\src\main.cpp:9:10: error: cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&' cout << t;

测试.h

#include <iostream>
#include <cstring>
using namespace std;
#ifndef SRC_TEST_H_BECCIO
#define SRC_TEST_H_BECCIO

namespace test {

class Test {
private:
    string mStr;
public:
    Test(string str);
    string getString(){return this->mStr;};
    ostream& operator<<(ostream& outs);
};

} /* namespace test */

#endif /* SRC_TEST_H_BECCIO */

测试 .cpp

#include "Test.h"

namespace test {

Test::Test(string str) {
    this->mStr=str;

}

ostream& Test::operator<<(ostream& outs){

    outs << this->getString()<<endl;
    return outs;
}

} /* namespace test */

主 .cpp

#include <iostream>
#include "Test.h"
using namespace std;
using namespace test;

int main() {

    Test t("let's hope this goes well");
    cout << t;
    return 0;
}
C++ Stream Operator 重载 IOSTREAM ostream

评论

2赞 WhozCraig 3/24/2022
算子重载的基本规则和习语是什么?具体来说,这里

答:

0赞 Solomon Ucko 3/24/2022 #1

看起来参数的顺序是倒退的。请参见 https://learn.microsoft.com/en-us/cpp/standard-library/overloading-the-output-operator-for-your-own-classes。 请尝试此声明,以及类似的实现:

friend ostream& operator<<(ostream& os, Test t);

评论

0赞 Beccio-san 3/24/2022
感谢您:)帮助,但现在我有一些问题要问你。1.为什么需要添加关键词?2. 为什么我不应该把关键词放在测试之前?最后 3.我可以在实现文件(Test.cpp)中编写友元函数的实现代码吗?还是我需要在与声明(Test.h)相同的文件中执行此操作?friendconst
0赞 Solomon Ucko 3/24/2022
@Beccio先生 不客气!如果我回答了这个问题,请参阅 stackoverflow.com/help/someone-answers。1. 它允许该方法访问 的私有成员。如果你用而不是直接实现它(小心额外复制对性能的影响!),你就不需要它了。2.好点子!它可能应该是 either 或 !3. 我假设你应该能够在任一位置编写它,只要头文件至少有一个声明。有关的更多信息,请参见 en.cppreference.com/w/cpp/language/friendTestgetStringmStrTest constTest const&friend