蓝和摩绿 2024-06-24 22:11 采纳率: 0%
浏览 7

关于我的高精度模板报了一大堆Error和Note这件事

蚌埠住了,高精模板爆error了

最近在写一个高精模板,编译test.cpp,,不知道哪错了,猜测也许是引用绑定的问题?
Error有这个:

10    7    P:\Codes\util\test.cpp    [Error] no match for 'operator<<' (operand types are 'std::ostream' {aka 'std::basic_ostream<char>'} and 'BigInteger')

剩下都是Note。

代码:
big_integer.h


#ifndef UTIL_BIG_INTEGER_H_
#define UTIL_BIG_INTEGER_H_

#include <istream>
#include <ostream>

class BigInteger {
public:
    BigInteger();

    friend std::ostream& operator << (std::ostream& os, BigInteger&& x);
private:
    static const int MAX_LENGTH = 100;

    int length;

    int signum;

    unsigned long long value[MAX_LENGTH];
};
#endif // UTIL_BIG_INTEGER_H_

big_integer.cpp

#include "big_integer.h"

#include <cstring>
#include <istream>
#include <ostream>

BigInteger::BigInteger() {
    length = 1;
    signum = 1;
    std::memset(value, 0, sizeof(value));
}

std::ostream& BigInteger::operator << (std::ostream& os, BigInteger&& x) {
    if (x.signum == -1)
        os << '-';
    for (int i = x.length - 1; i >= 0; i++)
        os << x.value[i];
    return os;
}

test.cpp

#include "big_integer.h"

#include <iostream>

using namespace std;

BigInteger bi = BigInteger();

int main() {
    cout << bi << '\n';
    return 0;
}
  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-06-24 22:11
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    从你提供的代码和错误信息来看,问题主要出现在big_integer.cpp文件中operator<<的实现上。错误信息提示没有找到匹配的operator<<用于std::ostreamBigInteger类型。这通常是因为重载的运算符函数没有正确声明或实现。

    问题分析

    1. 引用绑定问题:在big_integer.h中,你声明了operator<<为友元函数,但是使用了右值引用BigInteger&& x。这在大多数情况下是不必要的,因为operator<<通常不需要修改传入的对象。使用左值引用BigInteger& x会更合适。

    2. 实现错误:在big_integer.cpp中,operator<<函数的实现中,你尝试输出BigInteger对象的数值部分,但是没有考虑数值的位数和格式。此外,输出的顺序是从高位到低位,这可能不是你想要的格式。

    修复建议

    1. 修改operator<<的声明和定义:使用左值引用而不是右值引用。
    2. 添加必要的格式化:确保输出的数值是按照预期的格式,例如,如果BigInteger表示的是大数,你可能需要添加额外的逻辑来处理数值的位数。

    下面是修复后的代码示例:

    big_integer.h

    #ifndef UTIL_BIG_INTEGER_H_
    #define UTIL_BIG_INTEGER_H_
    
    #include <istream>
    #include <ostream>
    
    class BigInteger {
    public:
        BigInteger();
    
        friend std::ostream& operator << (std::ostream& os, const BigInteger& x); // 修改为左值引用
    private:
        static const int MAX_LENGTH = 100;
    
        int length;
    
        int signum;
    
        unsigned long long value[MAX_LENGTH];
    };
    
    #endif // UTIL_BIG_INTEGER_H_
    

    big_integer.cpp

    #include "big_integer.h"
    
    #include <cstring>
    #include <iostream>
    #include <iomanip> // 添加头文件以使用格式化功能
    
    BigInteger::BigInteger() {
        length = 1;
        signum = 1;
        std::memset(value, 0, sizeof(value));
    }
    
    std::ostream& operator << (std::ostream& os, const BigInteger& x) { // 修改为左值引用
        if (x.signum == -1)
            os << '-';
        
        // 假设value数组中存储的是大数的每一位,我们需要从最低位开始输出
        for (int i = 0; i < x.length; ++i) {
            os << x.value[i];
            if (i < x.length - 1) { // 如果不是最后一位,添加分隔符(例如逗号)
                os << ',';
            }
        }
        return os;
    }
    

    test.cpp

    #include "big_integer.h"
    
    #include <iostream>
    
    using namespace std;
    
    int main() {
        BigInteger bi;
        cout << bi << '\n';
        return 0;
    }
    

    请注意,我添加了<iomanip>头文件以便使用格式化功能,但在上面的例子中没有使用。你可能需要根据BigInteger类的具体实现来调整输出格式。

    参考链接

    希望这些修改能帮助你解决问题。如果你还有其他问题或需要进一步的帮助,请随时告诉我。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月24日

悬赏问题

  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?
  • ¥15 关于#vue.js#的问题:修改用户信息功能图片无法回显,数据库中只存了一张图片(相关搜索:字符串)
  • ¥15 texstudio的问题,
  • ¥15 spaceclaim模型变灰色
  • ¥15 求一份华为esight平台V300R009C00SPC200这个型号的api接口文档
  • ¥15 就很莫名其妙,本来正常的Excel,突然变成了这种一格一页
  • ¥15 字符串比较代码的漏洞
  • ¥15 欧拉系统opt目录空间使用100%
  • ¥15 ul做导航栏格式不对怎么改?