重载 [] 运算符时出现问题

Trouble overloading [] operator

本文关键字:问题 运算符 重载      更新时间:2023-10-16

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

页眉:

#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.cpp:

#include "Wektor.hh"
#include <iostream>
float Wektor::operator[] (int i){
if(i<=ROZMIAR) return skladowa[i];
 else return skladowa[ROZMIAR];}

std::istream& operator >> (std::istream &Strm, Wektor &Wek){
  std::cin >> Wek[1] >> Wek[2] >> Wek[3];
  return Strm;}
std::ostream& operator << (std::ostream &Strm, const Wektor &Wek){
  std::cout << Wek[1] << Wek[2] << Wek[3] << std::endl;
  return Strm;}

主要:

#include <iostream>
#include "Wektor.hh"
#include "Macierz.hh"
#include "UkladRownanLiniowych.hh"

using namespace std;
int main()
{
  Wektor w1;
  cin >> w1;
  cout << endl << " Wczytano: " << endl << endl;
  cout << w1 << endl;
}

我收到很多错误。例如,困扰我的是:

tobi@don-VM:~/PO/uklad$ make
g++ -c -g -Iinc -Wall -pedantic -o obj/main.o src/main.cpp
g++ -c -g -Iinc -Wall -pedantic -o obj/Wektor.o src/Wektor.cpp
src/Wektor.cpp: In function ‘std::istream& operator>>(std::istream&, Wektor&)’:
src/Wektor.cpp:11:12: error: no match for ‘operator>>’ (operand types are ‘std::istream {aka std::basic_istream<char>}’ and ‘float’)
   std::cin >> Wek[1] >> Wek[2] >> Wek[3];
            ^
src/Wektor.cpp:11:12: note: candidates are:
In file included from /usr/include/c++/4.8/iostream:40:0,
                 from inc/Wektor.hh:5,
                 from src/Wektor.cpp:1:

为什么它说>>float作为第二个运算符有问题?我想 [] 本身以某种方式工作,以防它将其解释为浮点类型,但为什么它不能与>>交互?我是新手,所以如果它是简单明了的东西,对不起,但我找不到它。我知道这可能是由于获得/未获得参考而发生的,但我无法弄清楚。

问题是您的运算符按值返回:

float operator[] (int i);

当你把这个结果直接传递给operator>>时,你传递了一个临时的,这个运算符需要一个左值引用,允许修改的东西。从技术上讲,不能在标准C++中将右值引用(临时)绑定到非常量引用。

因此,更改运算符以返回引用:

float& operator[] (int i);

通常的做法是提供const重载,返回const引用:

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