我的运营商有什么问题<<超载代码?

时间:2013-09-04 19:30:35

标签: c++ operator-overloading ostream

我正在尝试为一个类重载<< - 运算符,以便我可以使用std::cout。我已经复制了一些代码found online来执行此操作,但我无法使其工作。
我收到一条错误消息:

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"可以说。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:4)

您想制作name()方法const

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

这样,您就可以在const

operator<<引用中调用它

答案 1 :(得分:3)

您的参数argconst引用,但ElementCopy::name方法是非const。只需添加const

即可
        std::string name() const;

答案 2 :(得分:2)

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

答案 3 :(得分:1)

运算符需要是一个自由函数,因为左参数是流,而不是您的对象。您通常通过在班级中成为朋友来实现这一目标:

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

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