01/10/2018, 11:03

Lỗi C2679 binary '>>': no operator found which takes a right-hand operand of type 'Fraction' (or there is no acceptable conversion)

Em đang làm bài tập về nạp chồng toán tử thì gặp lỗi

Error (active)	no operator ">>" matches these operands
Error (active)		no operator "<<" matches these operands	

Error	C2679 binary '>>': no operator found which takes a right-hand operand 
of type  'Fraction' (or there is no acceptable conversion)

Error	C2679	binary '<<': no operator found which takes a right-hand operand
of type 'Fraction' (or there is no acceptable conversion)

.Em đã google nhưng cho ra các kết quả không như mong đợi. Mong các anh / chị giúp đỡ em với
Đây là code của em:

File: fraction.h

#ifndef _FRACTION_

#define _FRACTION_

#include <iostream>
using namespace std;

class Fraction {

public:
	Fraction(int, int);
	int GetNumerator();
	int GetDenominator();

private:
	int Numerator;
	int Denominator;
};

#endif // _FRACTION_

File: fraction.cpp

#include "fraction.h"

Fraction::Fraction(int _numerator = 1, int _denominator = 2) {

	this->Numerator = _numerator;
	this->Denominator = _denominator;
}

int Fraction::GetNumerator() {

	return this->Numerator;
}

int Fraction::GetDenominator() {

	return this->Denominator;
}

std::istream &operator >> (std::istream &in, Fraction &_fraction) {

	int _numerator = 0;
	cout << "
 Enter the numerator: ";
	in >> _numerator;

	int _denominator = 0;

	do {
		cout << " Enter the denominator: ";
		in >> _denominator;
	} while (_denominator == 0);

	_fraction = Fraction(_numerator, _denominator);
	return in;
}

std::ostream &operator<<(std::ostream &out, Fraction _fraction) {

	return out << _fraction.GetNumerator() << " / " << _fraction.GetDenominator() << endl;
}

File: main.cpp

#include "fraction.h"

int main() {

	Fraction mFraction(2, 3);

	cin >> mFraction;
	cout << mFraction;

	system("pause");
	return 0;
}

Thanks a lot !

Dark.Hades viết 13:12 ngày 01/10/2018

Bạn overload ở ngoài member class thì phải cho nó vào main.cpp
Nếu overload trực tiếp trong class thì mới tách file
Trường hợp của bạn thì phải include class.cpp

Nguyen Kien viết 13:03 ngày 01/10/2018

Anh cho em hỏi là tại sao khi để cùng một file [main.cpp] thì chạy đúng còn khi tách ra các file thì lại báo lỗi ạ ?

rogp10 viết 13:05 ngày 01/10/2018

Bạn đặt prototype của operator bên .h là main() nó thấy thôi.

Dark.Hades viết 13:07 ngày 01/10/2018

Cái này khi bạn khai báo hàm bên file .h thì nó mới tìm những chỗ được định nghĩa(bên cpp).

Trường hợp này bạn khai báo hàm đó bên .h rồi định nghĩa đầy đủ bên .cpp là sẽ chạy thôi

VS nó tự add các file cpp vào khi bạn tạo nên nếu không đọc source code của .vsp… gì ấy thì không hiểu vì sao nó lại như vậy. Nếu bạn từng dùng gcc biên dịch sẽ hiểu thôi

Nguyen Kien viết 13:18 ngày 01/10/2018

Em đã sử dụng hàm bạn thì chạy được rồi ạ

	friend std::istream& operator>>(std::istream &, Fraction &);
	friend std::ostream& operator<<(std::ostream &, Fraction);

Những khi em khai báo không dùng hàm bạn thì nó lại báo lỗi ạ ?

error: 'std::istream& Fraction::operator>>(std::istream&, Fraction&)' must take exactly one argument|
// Same error
	std::istream& operator>>(std::istream &, Fraction &);
	std::ostream& operator<<(std::ostream &, Fraction);
Dark.Hades viết 13:05 ngày 01/10/2018

Bạn cho lên trên .h là được rồi, đâu cần thiết phải khai báo friend.
Trường hợp viết overload operator cho class nên viết thẳng trong class, đừng viết kiểu non-member thế kia.

Bài liên quan
0