Lỗi kiểu dữ liệu khi sử dụng template

Mình đang học về phần class template và có một lỗi: không sử dụng được kiểu dữ liệu tự định nghĩa cho template. Ý định của mình là tạo một class template sắp xếp 1 dãy các số ( int , float , PhanSo ,…). Mình chạy kiểu int thì ổn nhưng PhanSo thì lại gặp lỗi. Mọi người giúp mình với.

PhanSo.h

    #pragma once
    #include <iostream>

    using namespace std;

    class PhanSo
    {
    private:
    	int _tu;
    	int _mau;

    public:
    	PhanSo();
    	PhanSo(int, int);
    	istream& operator>>(istream&);
    	ostream& operator<<(ostream&);
    	bool operator>=(PhanSo ps);
    	bool operator>(PhanSo ps);
    };

    PhanSo::PhanSo() {}
    PhanSo::PhanSo(int tu, int mau)
    {
    	_tu = tu;
    	_mau = mau;
    }

    istream& PhanSo::operator>>(istream& in)
    {
    	cout << "Nhap tu: ";
    	in >> this->_tu;

    	cout << "Nhap mau: ";
    	in >> this->_mau;

    	return in;
    }

    ostream& PhanSo::operator<<(ostream& out)
    {
    	out << this->_tu << "/" << this->_mau;
    	return out;
    }

    bool PhanSo::operator>=(PhanSo ps)
    {
    	if (_tu / _mau >= ps._tu / ps._mau)
    		return 1;

    	return 0;
    }

    bool PhanSo::operator>(PhanSo ps)
    {
    	if (_tu / _mau > ps._tu / ps._mau)
    		return 1;

    	return 0;
    }

sort.h

    #pragma once
    #include <iostream>

    using namespace std;

    template <class T>
    class sort
    {
    private:
    	T arr[10];
    	int _numEle;

    public:
    	sort() {};
    	sort(int numEle)
    	{
    		_numEle = numEle;
    	}

    	int getNumEle()
    	{
    		return _numEle;
    	}

    	template <class U>
    	friend istream& operator>>(istream& in, sort<U>& srt);

    	template <class U>
    	friend ostream& operator<<(ostream& out, sort<U> srt);
    };

    template <class U>
    istream& operator>>(istream& in, sort<U>& srt)
    {
    	cout << "Nhap so phan tu: ";
    	in >> srt._numEle;

    	for (int i = 0; i < srt._numEle; i++)
    	{
    		cout << "Nhap phan tu thu " << i + 1 << ": ";
    		in >> srt.arr[i];
    	}

    	return in;
    }

    template <class U>
    ostream& operator<<(ostream& out, sort<U> srt)
    {
    	for (int i = 0; i < srt._numEle; i++)
    	{
    		cout << "Nhap phan tu thu " << i + 1 << ": ";
    		out << srt.arr[i];
    	}

    	return out;
    }

main.cpp

    #include "sort.h"
    #include "PhanSo.h"

    int main()
    {
    	sort<PhanSo> ps;
    	cin >> ps;
    }

Lỗi:

        1>D:\C++\classTemplate\classTemplate\sort.h(41,1): error C2679:  binary '>>': no operator found which takes a right-hand operand of type 'T' (or there is no acceptable conversion)
        1>D:\C++\classTemplate\classTemplate\sort.h(41,1): error C2679:         with
        1>D:\C++\classTemplate\classTemplate\sort.h(41,1): error C2679:         [
        1>D:\C++\classTemplate\classTemplate\sort.h(41,1): error C2679:             T=PhanSo
        1>D:\C++\classTemplate\classTemplate\sort.h(41,1): error C2679:         ]

Bỏ template <class U> đi và chuyển tham số sort<U> thành sort<T>.

2 Likes

vẫn báo lỗi như cũ bạn ơi

Tham khảo:

2 Likes

Nếu dử dụng int hay float nó vãn bình thường. Nhưng kiểu PhanSo thì không? Bài tham khảo bạn đưa theo mình hiểu là nó đề cập tới vì sao khi sử dụng template cho class khi chia file bị lỗi thì phải (Tiếng Anh mình không giỏi lắm ^^)

// chú ý "<>"
friend istream& operator>> <>(istream& in, sort<T> srt);
// ...

template <class T>
istream& operator>>(istream& in, sort<T> srt){
    // ...
    return in;
}
3 Likes

nó vẫn bị lỗi như cũ bạn ơi @@

Coi lại oper>> của istream cho PhanSo sao ko phải là friend và chỉ có 1 tham số vậy :V

4 Likes

Thôi, cách nhanh nhất là triển khai ngay trong chỗ khai báo lớp. Không triển khai bên ngoài. Làm tương tự với lớp PhanSo.

template<class T>
class sort{
public:
// ...
friend istream& operator>>(istream& in, sort<T>& srt)
{
cout << "Nhap so phan tu: ";
    	in >> srt._numEle;

    	for (int i = 0; i < srt._numEle; i++)
    	{
    		cout << "Nhap phan tu thu " << i + 1 << ": ";
// Sửa lại 2 toán tử trong lớp PhanSo
    		// in >> srt.arr[i]; // ??? Lỗi
                srt.arr[i] >> in; // ??? @@
    	}

    	return in;
}
// ...
};

Bạn cũng nên sửa 2 phép toán >><< trong lớp PhanSo tương tự.

Xem thử:
https://repl.it/@SITUVNgcd/PhanSo11

3 Likes

có cái repl.it hay vậy :heart_eyes:

ngon lành có cả boost và gmp luôn =]]

3 Likes

bạn hay quá, chạy được rồi. Cám ơn bạn nhiều lắm <3

mình triền khai bên ngoài vậy nếu với chương trình lớn thì sao sửa lỗi với nâng cấp dễ dàng bạn ơi?

Cái này khá là tinh tế :smiley:

Một class/function template thay mặt cho vô số (nhấn mạnh là không thể biết trước số lượng) class/function trong tương lai. Nói cách khác template<typename T> class Klass không phải là một class. Klass<int> mới là class và biên dịch được.

4 Likes

class Klass là sao mình chưa hiểu?

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?