1

我正在尝试<<为一个类重载 -operator 以便我可以使用std::cout它。我复制了一些我在网上找到的代码来执行此操作,但我无法让它工作。
我收到一条错误消息:

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

错误在<<-operator 实现中:(请参阅我的代码注释)


这是我的头文件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

4 回答 4

4

你想做这个name()方法const

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

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

于 2013-09-04T19:32:22.820 回答
3

您的论点argconst参考,但ElementCopy::name方法是非常量的。只需添加一个const

        std::string name() const;
于 2013-09-04T19:32:32.990 回答
2

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

于 2013-09-04T19:34:47.747 回答
1

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

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

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

于 2013-09-04T19:31:53.177 回答