gpt4 book ai didi

c++ - 如果运算符是常量,运算符 << 重载通常会失败?

转载 作者:太空宇宙 更新时间:2023-11-04 15:35:46 24 4
gpt4 key购买 nike

如果我想重载 <<运算符使用 cout在类里面,它应该是这样的:

template <typename coutT>
friend ostream& operator << (ostream &, const vector3D<coutT>&);

在类里面,和

template <typename coutT>
ostream& operator << (ostream & os,const vector3D<coutT>& v)
{
os << "x: " << v.x<< " y: " << v.y << " z: " << v.z;
return os;
}

在外面。请注意const在第二个操作数。这个代码示例工作得很好。现在解决问题。

如果我使用字段的 getter 编写重载函数,而不是直接寻址它们(因为 operator<<friend ),我的编译器会抛出错误:

template <typename coutT>
ostream& operator << (ostream & os,const vector3D<coutT>& v)
{
os << "x: " << v.getX() << " y: " << v.getY() << " z: " << v.getZ();
return os;
}

错误:

(VisualStudio2012) errorC2662: "this-pointer cannot be converted from "const vector3D" in "vector3D&""

一个重要的注意事项是删除第二个操作数的“const”,这样它就像

 ostream& operator << (ostream & os,vector3D<coutT>& v){...}

结束编译器错误,但由于我不想更改 v ,它实际上应该是一个常量。

我还应该提到,我认为这可能与一般的方法调用有关,但我不确定。


编辑:所以解决了,将函数声明为 const 坚持 const 正确性。错误消息以无法将 const 类型转换为非常量类型的方式对其进行解释。

顺便说一句:实际上,我对快速响应印象深刻。

最佳答案

如果您想以这种方式使用 getter 函数,则应将其声明为 const

例如

int getValue() const {
return x;
}

完整示例:

#include <iostream>
#include <vector>

using namespace std;

class Foo {
int x;
public:

Foo(int a) : x(a) {
}

int getValue() const {
return x;
}

friend ostream & operator<<(ostream & out, const Foo & foo) {
return out << foo.getValue();
}

};

int main() {

vector<Foo> foo_vec = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

for (vector<Foo>::iterator it = foo_vec.begin(); it != foo_vec.end(); it++) {
cout << *it << ", ";
}

return 0;
}

关于c++ - 如果运算符是常量,运算符 << 重载通常会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34247684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com