C++ 重载[]运算符时出错

C++ 重载[]运算符时出错,c++,overloading,cin,C++,Overloading,Cin,所以我正在做一个向量/矩阵处理的程序,我不能重载索引操作符,我必须使用它(作为一个公共方法)来访问类的私有数据。代码: 标题: #ifndef WEKTOR_HH #define WEKTOR_HH #include "rozmiar.h" class Wektor { float skladowa[ROZMIAR]; public: float operator[] (int i); }; std::istream& operator >> (std:

所以我正在做一个向量/矩阵处理的程序,我不能重载索引操作符,我必须使用它(作为一个公共方法)来访问类的私有数据。代码:

标题:

#ifndef WEKTOR_HH
#define WEKTOR_HH

#include "rozmiar.h"
class Wektor {
  float skladowa[ROZMIAR];

  public:
  float operator[] (int i);

};


std::istream& operator >> (std::istream &Strm, Wektor &Wek);
std::ostream& operator << (std::ostream &Strm, const Wektor &Wek);

#endif
#如果没有
#定义WEKTOR_HH
#包括“rozmiar.h”
韦克托级{
斯克拉多瓦浮子[罗兹米亚尔];
公众:
浮点运算符[](int i);
};
std::istream&operator>>(std::istream&Strm、Wektor&Wek);
std::ostream&operator(std::istream&Strm、Wektor&Wek){
标准:cin>>Wek[1]>>Wek[2]>>Wek[3];
返回Strm;}
标准::ostream&operator>Wek[3];
^
src/Wektor.cpp:11:12:注:候选人为:
在/usr/include/c++/4.8/iostream:40:0中包含的文件中,
发自inc/Wektor.hh:5,
来自src/Wektor.cpp:1:
为什么它说用float作为第二个操作符的>>有问题?我猜[]本身在某种程度上起作用,因为它将其解释为浮点类型,但为什么它不能与>>交互?我是新来的,所以如果这是一些简单和明显的抱歉,但我找不到它。
我知道这可能是由于获取/未获取引用而发生的,但我无法理解。

问题是运算符按值返回:

float operator[] (int i);
当您将此操作的结果直接传递给
运算符>>
时,您传递的是一个临时值,此运算符需要一个左值引用,这是允许它修改的。从技术上讲,您不能将RValk引用(临时)绑定到标准C++中的非const引用。 因此,更改运算符以返回引用:

float& operator[] (int i);
const float& operator[] (int i) const;
通常的做法是提供
const
重载,返回
const
引用:

float& operator[] (int i);
const float& operator[] (int i) const;

问题在于运算符按值返回:

float operator[] (int i);
当您将此操作的结果直接传递给
运算符>>
时,您传递的是一个临时值,此运算符需要一个左值引用,这是允许它修改的。从技术上讲,您不能将RValk引用(临时)绑定到标准C++中的非const引用。 因此,更改运算符以返回引用:

float& operator[] (int i);
const float& operator[] (int i) const;
通常的做法是提供
const
重载,返回
const
引用:

float& operator[] (int i);
const float& operator[] (int i) const;

问题在于运算符按值返回:

float operator[] (int i);
当您将此操作的结果直接传递给
运算符>>
时,您传递的是一个临时值,此运算符需要一个左值引用,这是允许它修改的。从技术上讲,您不能将RValk引用(临时)绑定到标准C++中的非const引用。 因此,更改运算符以返回引用:

float& operator[] (int i);
const float& operator[] (int i) const;
通常的做法是提供
const
重载,返回
const
引用:

float& operator[] (int i);
const float& operator[] (int i) const;

问题在于运算符按值返回:

float operator[] (int i);
当您将此操作的结果直接传递给
运算符>>
时,您传递的是一个临时值,此运算符需要一个左值引用,这是允许它修改的。从技术上讲,您不能将RValk引用(临时)绑定到标准C++中的非const引用。 因此,更改运算符以返回引用:

float& operator[] (int i);
const float& operator[] (int i) const;
通常的做法是提供
const
重载,返回
const
引用:

float& operator[] (int i);
const float& operator[] (int i) const;


您的常量重载具有错误的返回类型。另外,对于足够小的内置类型,通常按值返回,而不是使用常量引用。@重复数据消除或Oops,剪切和粘贴失败。不过我会保留参考资料。按值返回是不一样的。如果不是内联的,风格和效率是问题,这就是我在这种情况下避免引用的原因(除非我写了一个模板,这是额外的工作)。我相信有人可以在那里点燃一股好的火焰…@deplicationdelicator这不是风格的问题。语义是完全不同的。我会发现,根据方法的常量更改返回类型会让人困惑。Semantics=如何使用它。据我所知,唯一的额外有效用途是获取地址。取决于您看到的const ref的用途,我认为是:为了效率/正确性而避免复制。您的const重载具有错误的返回类型。另外,对于足够小的内置类型,通常按值返回,而不是使用常量引用。@重复数据消除或Oops,剪切和粘贴失败。不过我会保留参考资料。按值返回是不一样的。如果不是内联的,风格和效率是问题,这就是我在这种情况下避免引用的原因(除非我写了一个模板,这是额外的工作)。我相信有人可以在那里点燃一股好的火焰…@deplicationdelicator这不是风格的问题。语义是完全不同的。我会发现,根据方法的常量更改返回类型会让人困惑。Semantics=如何使用它。据我所知,唯一的额外有效用途是获取地址。取决于您看到的const ref的用途,我认为是:为了效率/正确性而避免复制。您的const重载具有错误的返回类型。另外,对于足够小的内置类型,通常按值返回,而不是使用常量引用。@重复数据消除或Oops,剪切和粘贴失败。不过我会保留参考资料。按值返回是不一样的。如果不是内联的,风格和效率是问题,这就是我在这种情况下避免引用的原因(除非我写了一个模板,这是额外的工作)。我相信有人可以在那里点燃一股好的火焰…@deplicationdelicator这不是风格的问题。语义是完全不同的。我会发现,根据方法的常量更改返回类型会让人困惑。Semantics=如何使用它。据我所知,唯一的额外有效用途是获取地址。取决于您看到的const ref的用途,我认为是:为了效率/正确性而避免复制。您的const重载具有错误的返回类型。另外,对于足够小的内置类型,通常按值返回,而不是使用常量引用。@重复数据消除或Oops,剪切和粘贴失败。我会把参考资料留给你的