Friend 方法作为常量

Friend methods as Constant

为什么我不能将友元函数声明为 const

//Types.h
#pragma once
#include <string>
#include <ostream>

class Player
{
public:
    //constructors
    Player();
    Player(const std::string&, unsigned short);

    //operator overload
    friend std::ostream& operator<<(std::ostream&, const Player&);
//                  (I can't declare it as const)

    //getter
    const std::string& get_id() const;

private:
    std::string id;
    unsigned short lvl;
};
//Types.cpp
#include "Types.h"
#include <iostream>
#include <iomanip>

/*other definitions*/

std::ostream& operator<<(std::ostream& out, const Player& print)
{
    out << "Player: " << std::setw(6) << print.id << " | " << "Level: " << print.lvl;
    return out;
}

我的意思是,如果我想在常量变量或常量函数中调用 operator<<,我会得到一个错误,因为 operator<< 不是 constant,即使它没有改变 class.

中的任何内容

但是 operator<< 不是会员 - 它是免费功能。所以没有它不修改的基础对象。

int myFunc() const {
    return 3;
}

编译器也报错:

error: non-member function 'int myFunc()' cannot have cv-qualifier

您的 operator<< 版本也很奇怪,因为它没有将任何内容输出到它应该输出的流中,而是更喜欢将内容输出到 std::cout!

我认为你应该重新考虑你希望实现的目标,因为你正在尝试做一些非标准的事情。如果您只想要一个将 class 的内容写入 std::cout 的方法,那么只需这样做,而不是重载运算符。

请注意,如果您有一些其他的 iostream,您会惊讶于其中没有任何内容!

std::ofstream myFile("my_path");
myFile << Player;