麻烦重载[]运算符

时间:2014-04-03 18:39:06

标签: 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::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:

为什么说&gt;&gt;出现问题?以浮动为第二运营商?我猜[]本身是以某种方式工作的,因为它将它解释为浮点类型,但为什么它不能与&gt;&gt;进行交互。 ?我是新手,所以如果它是简单而明显的抱歉,但我无法找到它。 我知道可能会因为获得/未获得参考而发生,但我无法弄明白。

1 个答案:

答案 0 :(得分:3)

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

float operator[] (int i);

当您将结果直接传递给operator>>时,您传递的是临时的,并且此运算符需要左值引用,允许修改它。从技术上讲,您不能将右值引用(临时)绑定到标准C ++中的非const引用。

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

float& operator[] (int i);

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

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