2015-07-03 21 views
5

Tôi không thể hiểu được thông báo lỗi tôi nhận được khi tôi biên dịch mã này trong trình bao Cygwin. Thông điệp là rất dài, nhưng ở đâu đó ở giữa lỗi 1.000 dòng này nó nói:Mã mẫu này sẽ không biên dịch

không gọi phù hợp cho nhà điều hành <

này có nghĩa là gì? Đây là mã của tôi:

#include <iostream> 
#include <string> 
#include <set> 
#include <algorithm> 
#include <iterator> 

using namespace std; 

struct Grade{ 
string id; 
int score; 

    bool operator() (Grade& a, Grade& b){ 
     return a.id < b.id; 
    } 
}; 

int main() 
{ 
    Grade g; 
    set<Grade> gs; 

    g.id = "ABC123"; 
    g.score = 99; 
    gs.insert(g); 

    g.id = "BCD321"; 
    g.score = 96; 
    gs.insert(g); 

    for(auto it : gs) 
     cout << it.id << "," << it.score; 

    return 0; 
} 
+0

'set' lưu trữ các phần tử theo thứ tự sắp xếp, yêu cầu loại dữ liệu của bạn phải có toán tử' Alejandro

+0

Tôi hiểu, làm thế nào tôi có thể xác định nó? – XDProgrammer

+2

Bạn có thể muốn xem xét đánh dấu "đã giải quyết" trong các câu hỏi trong quá khứ của mình: http://stackoverflow.com/users/4416304/xdprogrammer?tab=questions –

Trả lời

-2

Đây là mã được cập nhật để biên dịch chính xác. Vấn đề đối với "hành <" cho std::set đã được giải quyết:

#include <iostream> 
#include <string> 
#include <set> 
#include <algorithm> 
#include <iterator> 

using namespace std; 

struct Grade{ 
    string id; 
    int score; 

    bool operator<(const Grade& that) const 
    { 
     return this->score < that.score; 
    } 

    bool operator() (Grade& a, Grade& b){ 
     return a.id < b.id; 
    } 
}; 

int main() { 
    Grade g; 
    set<Grade> gs; 

    g.id = "ABC123"; 
    g.score = 99; 
    gs.insert(g); 

    g.id = "BCD321"; 
    g.score = 96; 
    gs.insert(g); 

    for(auto it : gs) 
     cout << it.id << "," << it.score; 

    return 0; 
} 
+0

Việc so sánh đang được thực hiện trên các đối tượng 'Lớp' không phải là chuỗi. –

+0

@Captain .. nếu bạn có một cái nhìn tại việc thực hiện các nhà điều hành() hai id đang được so sánh ở đó. –

+0

Vì vậy, tôi đã làm 'a.id XDProgrammer

10

Bộ yêu cầu loại nguyên tố của họ để xác định ít hơn điều hành. Xem http://www.cplusplus.com/reference/set/set/?kw=set

Bạn có thể định nghĩa nó như thế này (sau khi định nghĩa của lớp):

bool operator< (const Grade& a, const Grade& b){ 
    return a.id < b.id; 
} 
+0

Tôi nên xác định điều này ở đâu? Khi tôi thêm nó vào cấu trúc nó nói, phải có một đối số – XDProgrammer

+0

@XDProgrammer Bên ngoài định nghĩa 'Lớp' – qbt937

7

std::set cửa hàng các yếu tố của nó để sắp xếp, đòi hỏi loại nguyên tố của nó để có một operator < định nghĩa cho nó. Trong trường hợp này, bạn cần phải xác định operator < cho loại Grade của mình.

bool operator < (const Grade& grade1, const Grade& grade2) 
{ 
    return grade1.score < grade2.score; // or other method of determining 
             // if a grade is less than another 
} 

Hoặc nếu bạn muốn định nghĩa nó trong struct bản thân:

bool operator < (const Grade& grade2) const 
{ 
    return score < grade2.score; // or other method of determining 
            // if a grade is less than another 
} 
+0

Có vẻ như cả hai chúng tôi đều trả lời cùng một lúc :). Tôi có nên xóa của tôi? – qbt937

+0

@ qbt937, tôi không nghĩ điều đó là cần thiết, ai là người biết ai sẽ trả lời đầu tiên! – Alejandro

6

Bạn có thể tạo một std::set<Grade> nếu bạn quá tải operator<() chức năng cho Grade. Hàm có thể được định nghĩa bằng hàm thành viên hoặc hàm không phải thành viên.

Bất kể bạn đang tiếp cận phương pháp nào, hàm phải được xác định sao cho cả LHS và RHS có thể là đối tượng const.

chức năng

thành viên cách tiếp cận:

struct Grade{ 
    string id; 
    int score; 

    bool operator<(Grade const& rhs) const 
    { 
     return this->id < rhs.id; 
    } 
}; 

chức năng tiếp cận phi thành viên:

struct Grade{ 
    string id; 
    int score; 
}; 

bool operator<(Grade const& lhs, Grade const& rhs) 
{ 
    return lhs.id < rhs.id; 
} 
2

Cảm ơn tất cả mọi người đã giúp đỡ, Ive nhìn thấy nhiều giải pháp, và đây là mã của tôi, mà sắp xếp các ID trong thứ tự tăng dần

#include <iostream> 
#include <string> 
#include <set> 
#include <algorithm> 
#include <iterator> 

using namespace std; 

struct Grade{ 
string id; 
int score; 

bool operator< (const Grade& g) const { 

    return this->id < g.id; 
} 
}; 


int main() 
{ 
    Grade g; 
    set<Grade> gs; 

    g.id = "ABC123"; 
    g.score = 99; 
    gs.insert(g); 

    g.id = "BCD321"; 
    g.score = 96; 
    gs.insert(g); 

    for(auto it : gs) 
     cout << it.id << "," << it.score << endl;; 

    return 0; 
Các vấn đề liên quan