所以我正在为矢量/矩阵处理做一个程序,我不能重载索引操作符,我必须使用它(作为公共方法)来访问类的私有数据。代码:
部首:
#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;进行交互。 ?我是新手,所以如果它是简单而明显的抱歉,但我无法找到它。 我知道可能会因为获得/未获得参考而发生,但我无法弄明白。
答案 0 :(得分:3)
问题是您的运算符按值返回:
float operator[] (int i);
当您将结果直接传递给operator>>
时,您传递的是临时的,并且此运算符需要左值引用,允许修改它。从技术上讲,您不能将右值引用(临时)绑定到标准C ++中的非const引用。
因此,更改运算符以返回引用:
float& operator[] (int i);
通常的做法是提供const
重载,返回const
引用:
const float& operator[] (int i) const;