我的运算符<<重载代码有什么问题?
What is wrong with my operator<< overload code?
我正在尝试重载类的<<
运算符,以便我可以对它使用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。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++避免重复声明的语法是什么
- c++库的公共头文件中应该包含什么
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- ifstream什么都没读
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 什么是模板&lt;&gt;inline bla bla
- &lt;&lt;&lt;的这些超载有什么区别操作员
- 这是做什么的?如果(无符号(dx) & lt;无符号(大小))
- 什么会导致死亡<<变量& lt; & lt;“ t";当输出超过终端宽度时,打印空白而不是值