我正在尝试为一个类重载<<
- 运算符,以便我可以使用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"
可以说。我该如何解决这个问题?
答案 0 :(得分:4)
您想制作name()
方法const
:
class ElementCopy
{
public:
std::string name() const;
};
这样,您就可以在const
operator<<
引用中调用它
答案 1 :(得分:3)
您的参数arg
是const
引用,但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。