g ++编译器为表达式提供<<类型错误,但可在Visual Studio中使用

聊天室

好的,我认为这可能只是版本问题,但是我对此并不陌生。我有一个主文件,该文件将重写的<<运算符用于BigInt已实现类:

BigInt a = 3;
cout << a << endl;
cout << (a+a) << endl;

在Visual Studio中,编译器可以很好地理解所有内容,并且运行良好。但是转到Ubuntu 14.04,make使用我的Makefile(使用简单g++命令)后,会出现由第三行(以及使用cout和表达式的任何其他行)引起的成千上万个类型错误如果我删除第三行,它的编译效果很好。第一个错误是:

main.cpp:23:8: error: no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'BigInt')
    cout << (a+a);
         ^

这很令人困惑,因为我的<<操作员函数使用了引用参数:

// in BigInt.h, in class' public section:

BigInt operator+(BigInt const& other) const;
friend std::ostream & operator<<(std::ostream& os, BigInt& num);


// in BigInt.cpp:

BigInt BigInt::operator+(BigInt const& other) const {
    // call appropriate helper based on signs
    if (this->neg == other.neg) {
        return sum(other);
    }
    else {
        return difference(other);
    }
}

ostream & operator<<(ostream& os, BigInt& num) {
    if (num.dataLength == -1) {
        os << "**UNDEFINED**";
    }
    else {
        if (num.neg) os << "-";
        if (num.dataLength == 0) {
            os << "INFINITY";
        }
        else {
            // print each digit
            for (int i = num.dataLength - 1; i >= 0; i--) {
                os << (short)num.data[i];
            }
        }
    }
    return os;
}

那么,为什么第一个cout起作用而第二个却不起作用?有没有可以运行的方法g++

炸鱼
ostream & operator<<(ostream& os, BigInt& num)

应该带一个BigInt const& numMSVC就此而言不兼容g ++没有此扩展名。

确保同时更改标题中的声明和BigInt.c文件中的定义(此外,通常对.c包含C代码.cpp的文件包含C++代码的文件使用。)

原因是(a+a)创建了一个临时表 BigInt,该临时表不能绑定到非const引用。第一个cout起作用是因为a它是局部变量,而不是临时变量,因此可以作为常规(非const)引用传递

除临时性问题外,应用const-correctness是一个好习惯const除非确实需要更改,否则请进行更改。这可以帮助防止错误。请注意,std::ostream& os不能为const,您实际上确实可以通过写入对其进行更改。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当 Visual Studio 运行良好时,向量迭代器上的 LInux g++ 编译器错误

Visual Studio 可能是错误的编译器错误

使用编译器运行代码后出现段错误

声明数组时出现编译器错误:编译器无法对...不同的子表达式进行类型检查

VBA 正则表达式 - 公式中使用的值是错误的数据类型

错误:PickerView“无法将类型为“[String]”的返回表达式转换为返回类型“String?” ”

C++ 为什么在不使用被删除的函数时编译器失败,错误代码为 C2280

程序适用于 onlineGDB 编译器,但使用 MinGW 编译时出现逻辑错误

在 xPath 表达式中使用变量

C++ 在方程中使用变量;错误:表达式必须具有整数或无作用域枚举类型及其他

Visual Studio 2015 CE Javascript 编辑器无法识别正则表达式中的“(?”

类型测试为联合测试表达式产生错误

变量附近的语法错误,期望在循环中使用步骤表达式(XQuery、SQL Server)

如何使用 Visual Studio 编译器在 Windows 上编译 cython 编译的 c 代码

Vector.push_back(std::function<void()>); 绕过编译器要求表达式的方法

VSCode 在 g++ 编译器上运行 C++ 程序时显示错误

非常简单的 After Effects 表达式返回“表达式中使用的未定义值”错误

Xcode 12.5 编译器错误,不能在需要类型“someType”的上下文中使用“nil”

在 C++ 中使用继承的编译器错误

错误 C2131:使用 constexpr 时,表达式未计算为常量

Visual Studio 代码 - 正则表达式 - 编辑多行?

使用参数为 url 编写正则表达式

编译器如何在 if 语句中使用多个比较运算符计算表达式?

Visual Studio 编译器错误(不能使用逗号)

Visual Studio 2019 在瀏覽器中使用 VB 打開 URL

此表达式的类型为 'a 列表,但表达式应为 'b * 'c 类型

Dart 运算符:名称“b”不是类型,不能在“is”表达式中使用

为什么在这种情况下我为 switch 表达式和 case 值使用不同的数据类型时没有编译错误

为什么它给我这个错误?此表达式的类型为 Zt,但表达式应为 int 类型

无法隐藏状态栏 - Flutter - 此表达式的类型为“void”,因此无法使用其值