我的运算符<<重载代码有什么问题?

What is wrong with my operator<< overload code?

本文关键字:lt 什么 问题 重载 运算符 我的 代码      更新时间:2023-10-16

我正在尝试重载类的<<运算符,以便我可以对它使用std::cout。 我已经复制了一些我在网上找到的代码来做到这一点,但我无法让它工作。
我收到一个错误,说:

error C2662: 'nspace::ElementCopy::name' : cannot convert 'this' pointer 
from 'const nspace::ElementCopy' to 'nspace::ElementCopy &'

错误出在<<运算符实现中:(请参阅我的代码注释)


这是我的头文件ElementCopy.h

#pragma once
#include <string>
#include <iostream>
namespace nspace
{
    class ElementCopy
    {
        public:
            std::string name();
    };
    std::ostream& operator<< (std::ostream& stream, const ElementCopy& arg)
    {
        stream << arg.name(); //compiler error at this line
        return stream;
    }
}

这是我的简短代码文件ElementCopy.cpp

#include "ElementCopy.h"
namespace nspace
{
    std::string ElementCopy::name()
    {
        return "string";
    }
}

我无法弄清楚此错误。 我为什么会得到它? 运算符重载没有"this"可言。 我该如何解决这个问题?

你想让name()方法const

class ElementCopy
{
    public:
        std::string name() const;
};

这样,您将被允许在operator<<中的const引用上调用它

你的参数arg是一个const引用,但ElementCopy::name方法是非常量。 只需添加一个const

        std::string name() const;

您的name()方法不是常量,您可能希望在声明后添加const

运算符

需要是一个自由函数,因为左参数是流,而不是你的对象。您通常通过让它成为班级内的朋友来实现这一点:

friend std::ostream& operator<< (std::ostream& stream, const ElementCopy& arg)
{
    return stream << arg.name();
}

由于name()是一个公共成员函数,因此您还可以在类定义之外声明整个事情。friend关系通常用于方便地访问私有成员,而无需仅仅为了流操作员而使用 getter。