2012-03-19 36 views
6

Tôi đang gặp sự cố khi chuyển functor của tôi từ cửa sổ sang linux. (Một functor để vượt qua để stl :: bản đồ cho trật tự nghiêm ngặt-yếu) Bản gốc như sau:Lỗi: chuyển const xxx làm đối số này của xxx loại bỏ vòng loại

struct stringCompare{ // Utilized as a functor for stl::map parameter for strings 
    bool operator() (string lhs, string rhs){ // Returns true if lhs < rhs 
     if(_stricmp(lhs.c_str(), rhs.c_str()) < 0) return true; 
     else return false; 
    } 
}; 

Như linux doesnt hỗ trợ _stricmp nhưng sử dụng strcasecmp thay vào đó, tôi đã thay đổi nó để:

struct stringCompare{ 
    bool operator() (string lhs, string rhs){ // Returns true if lhs < rhs 
     if(strcasecmp(lhs.c_str(), rhs.c_str()) < 0) return true; 
     else return false; 
    } 
}; 

Và nó hiện đang phàn nàn về thông số "const":

passing const stringCompare as this argument of bool stringCompare::operator() 
(std::string, std::string)â discards qualifiers 

tôi không hoàn toàn chắc chắn tại sao nó giả stringCompare nên là một hằng số ...

Và dòng nơi mà nó là điên về vấn đề này được khởi tạo là:

if(masterList->artistMap.count(songArtist) == 0) 

artistMap là một STL bản đồ :: với một phím chuỗi.

Tôi không chắc mình sẽ sai ở đâu. Tôi đã cố gắng thay đổi các tham số bool operator() thành const, vì nó xuất hiện rằng nó phàn nàn về một số loại tham số không cố định đi qua. Điều này không làm việc, cũng không thay đổi 'toán tử bool()' thành 'const bool operator()'. Theo như tôi biết, strcasecmp là một hàm const nên trường hợp cho dù tôi vượt qua nó không liên tục hoặc hằng số tham số (c_str() cũng là const), vì vậy tôi không chắc chắn chính xác nơi tôi đang đi sai .

Tôi đã giải quyết các vấn đề tương tự nhưng tôi vẫn không thể hiểu được vấn đề từ những gì tôi đã thấy cả trên stackoverflow và một vài địa điểm khác.

Các kiểu dữ liệu mà tôi đang sử dụng này là:

map<string, set<song, setSongCompare>*,stringCompare > artistMap; 
+0

lẽ liên quan đến 'vòng loại const' ?? Cảnh báo có được báo cáo tại bản khai 'bản đồ' hay không? – Kashyap

+0

Bạn nên sử dụng thuật toán chuỗi tốt hơn và hoạt động trên chuỗi std :: chứ không phải const char *. có một cho so sánh trường hợp insensative. – 111111

+0

nó đang được báo cáo tại dòng này: nếu (masterList-> artistMap.count (songArtist) == 0) nơi bài hátArtist là một chuỗi – Glem

Trả lời

10

Hai điều:

  1. Xác định bạn bool operator() như const. Nó chỉ là một thực hành tốt. Điều này cho trình biên dịch biết rằng hàm này sẽ không có tác dụng phụ trên các biến thành viên của lớp.

  2. Thêm const & vòng loại vào các đối số lhsrhs. Việc chuyển các tham chiếu liên tục thay vì sao chép bộ nhớ khắp nơi cũng là thực hành tốt. Bằng cách khai báo các tham chiếu là const, bạn đang nói với trình biên dịch rằng hàm này không nên có các tác dụng phụ trên các đối tượng được tham chiếu.

bạn operator() nên xem xét như sau:

bool operator() (const string &lhs, const string &rhs) const 
{ 
    return strcasecmp(lhs.c_str(), rhs.c_str()) < 0; 
} 
+0

Như tôi đã đề cập, tôi đã thử điều này và nó mang lại kết quả tương tự. – Glem

+1

@Glem Không phải 'const bool operator() (...)' nhưng 'bool operator() (...) const' – Praetorian

+0

Tôi nghĩ rằng tôi đã thử nó theo cách này, nhưng tôi cho là không! Điều này đã làm việc. Tại sao yêu cầu const sau thông số? Tôi chưa từng thấy điều này trước đây. Ngoài ra, không nên trong lý thuyết không phải lo lắng về const nếu không có hàm bên trong nào là không liên tục? Chỉ vì vậy tôi có thể làm rõ trong đầu của tôi tại sao lỗi xảy ra. Cảm ơn bạn! – Glem

Các vấn đề liên quan