“不匹配'operator <

问题描述 投票:0回答:1

只是一个错字!

通过使用cout而不是stdout解决了

“在尝试在C ++中打印字符串或对象时,'operator <

但包含:

(Eclipse)sources.mk找不到并包含所有子目录(已解决),方法是将名为headers的文件夹重命名为r_headers,删除sources.mk并刷新,然后添加另一个名为a_test的文件夹。我不知道为什么即使在添加另一个文件夹之前先关闭eclipse也无法正常工作,但它神奇地开始查找所有子目录。

所以我只是要更改标签,说这是因为我在任何地方都没有看到它,而且很幸运我修复了它。

感谢那些花时间在我烦恼的恐慌中向我指出错别字的人,我对此深表谢意,以至于我太被思想上的困扰所困扰!

原始

我是C ++的新手,我已经为自己的编译器和IDE进行了3天的设置,终于有了Cygwin和Eclipse来和平构建文件,而路径或makefile却没有致命错误。这些构建器是:CDT构建器和扫描仪配置构建器。

这可能是相关的,因为以下代码不会针对我的对象或字符串进行编译,即使我替换为:stdout << "hello";直接仍然返回二进制文件'operator <

的类型'__FILE *'{aka'__sFILE64 *'}和'const char [6]'的无效操作数

我以为该设置有效,因为我初始化了一个hello world文件并运行了,但是现在src文件夹中已经包含所有带有子目录的实际代码,它似乎不再起作用。

我尝试过的:

-必须在学校使用Visual Studio。它完全停止在mylaptop上工作。我在stdout上遇到问题,这使我开始质疑代码,但似乎是Visual Studio更改了标志的数据结构,加上make文件是一场噩梦,无法弄清楚将.o文件放在哪里,所以我决定在另一台计算机上安装eclipse,看看是否更容易。

-为c ++安装的Eclipse,反之则为:4.14.0

-我将cygwin gcc,gnu,debug等更新为最新版本

启用常规属性的自动刷新-我通过将headers文件夹重命名为r_headers来修复sources.mk(不包括子目录),删除了sources.mk并刷新了很多,然后添加了另一个名为a_test的文件夹。我不知道为什么在添加另一个文件夹之前它不起作用,但是它神奇地开始查找所有子目录。

-在我的包含文件中,对我来说,似乎包括了所有必需的东西(Windows 10 64位)c:/ cygwin64 / usr /(包含/包含/ w32api)c:/ cygwin64 / lib / gcc /.../(包括,c ++,c ++ / backward,c ++ / x86_64-pc-cygwin)

相关的MyObject代码段

(代码本身更复杂,但是我只想知道错误是否真的很简单,而我却没有得到非常基本的东西!)

如果与本项目相关的组织如下:

-includes
-src
    main.cpp
    main.h
    -objs
        MyObject.cpp
        -r_headers
            MyObject.h

MyObject.h

#include <iostream>
#include <string>
using std::string;
class MyObject {
private:
    string s1;
    sting s2;
public:
    MyObject();
    std::ostream& operator<<(MyObject const& o);
    std::string toString();
};

MyObject.cpp

MyObject(){
    s1 = "hello";
    s2 = "world";
}

std::ostream& operator<<(std::iostream& os, MyObject const& o) {
    std::string s = toString();
    os << s;
    return os;
}

std::string toString() {
    return s1+s2;
}

main.cpp

#include <iostream>
#include <string>

#include "../r_headers/MyObject.h"

using std::string;
using std::cout;
using std::endl;

void test_print_mo() {
    MyObject o = MyObject();
    //string s= MyObject.toString();
    //stdout << o; // or s which doesn't work eitherbecause I made a typo woops
    cout << o;

}
int main() {

    test_print_mo();

    //do not delete, make sure window doesn't close
    cin.get();
    return 0; //for ccompiler

}

非常感谢您,最近几天一直没什么用,因为我什么都不能正常工作!

c++ eclipse makefile cygwin
1个回答
1
投票

对于初学者来说有错字

class MyObject {
private:
    string s1;
    sting s2;
    ^^^^^
    //...

此运算符

std::ostream& operator<<(MyObject const& o);

与该运算符不同

std::ostream& operator<<(std::iostream& os, MyObject const& o) {
    std::string s = toString();
    os << s;
    return os;
}

似乎是该成员函数

std::ostream& operator<<(MyObject const& o);

是多余的。

此外,在类之外的类成员的定义中,您必须使用限定名称,例如

MyObject::MyObject(){
    s1 = "hello";
    s2 = "world";
}

该类可以在标题中定义,例如

class MyObject {
private:
    string s1;
    sting s2;
public:
    MyObject();
    std::string toString() const;
};

类成员可以定义为

MyObject::MyObject() : s1( "hello" ), s2( "world" ){
}

std::string MyObject::toString() const {
    return s1 + " " + s2;
}

和运算符<

inline std::ostream & operator<<(std::ostream& os, MyObject const& o) {
    return os << o.toString();
}

请注意,它应该使用std::ostream&,而不是std::iostream&

© www.soinside.com 2019 - 2024. All rights reserved.