std::vector const 对象无法访问

std::vector inaccessibility with const onject

我试图重载直方图 class 的 << 运算符,其头文件是:

#ifndef HISTOGRAM_H
#define HISTOGRAM_H
#include<bits/stdc++.h>

class Histogram{
    private:
        std::vector<float>   listOfElements;
        std::vector<float>  sortedListOfElements;
        std::vector<float>  bucketValues;
        std::vector<float>  bucketFrequencies;
        int numberOfBuckets;
        void setSortedListOfElements();
        void setBucketValues();
        void setBucketFrequencies();
        

    public:
        Histogram(std::vector<float>, int = 10);
        Histogram(const Histogram &obj);
        ~Histogram();

        

        std::vector<float> getListOfElements();
        std::vector<float> getSortedListOfElements();
        std::vector<float> getBucketValues();
        std::vector<float> getBucketFrequencies();
        friend ostream& operator<<(ostream &out, const Histogram &hs);

        static float truncfn(float x);

};

这是我在 Histogram.cpp

中尝试过的
ostream & operator<< (ostream &out, const Histogram &hs){
        out.precision(4);
        out<<fixed;
        int k;
        vector<float>vals = hs.bucketValues;
        vector<float>freq = hs.bucketFrequencies;
        for(k = 0; k<10; k++){
            out<<showpoint<<hs.truncfn(vals[k])<<",";
        }
        out<<showpoint<<hs.truncfn(vals[k])<<" ";
        int j;
        for(int j = 0; j < 9; j++){
            out<<showpoint<<hs.truncfn(freq[j])<<",";
        }
        out<<showpoint<<hs.truncfn(freq[j]);
        return out;
}

但是,bucketValuesbucketFrequencies 无法从此常量对象 hs 访问。我该如何解决这个问题?
我需要函数参数有一个常量,因为这个 << 运算符正在另一个 class 中使用,其中包含 Histogram

任何帮助将不胜感激:)

在提供的代码中,您没有在 header 中使用“using namespace std”,这是正确的,因此 ostream 未定义(除非它成为以位为单位的全局命名空间,这会很糟糕)并且编译器可能会将两次出现的 ostream 视为不同的类型,因此在直方图 class 中声明的 friend operator<< 具有与函数 operator<< 在你的 cpp 文件中。尝试使用 std::ostream,而不是。

您还可以通过不复制 operator<< 中的向量来改进代码 - 使用引用,或者更好的是,const 引用:

const vector<float>& vals = hs.bucketValues;
const vector<float>& freq = hs.bucketFrequencies;