2011-11-21 23 views
8

Vì vậy, tôi đã có một mảng (0 - n), giữ giá trị mà tôi muốn std :: thiết lập để sử dụng cho nó phân loại. Mảng là unsigned int chi phí [n].Tại sao tôi không thể xây dựng std :: thiết lập với một instantiation của một predicate, nhưng tôi có thể gán một std :: set được xây dựng theo cách đó?

Tôi đang sử dụng functor sau đây để phân loại này:

struct ProxySorter { 
    ProxySorter(const unsigned* arr) : proxy_array(arr) {} 
    bool operator()(const unsigned& a, const unsigned& b) const { 
    return proxy_array[a] < proxy_array[b]; 
    } 
    const unsigned* proxy_array; 
}; 

Vì vậy, đây là vấn đề ... Khi tôi xây dựng các thiết lập, đây là quy phạm pháp luật:

std::set<unsigned, ProxySorter> node_queue = std::set<unsigned, ProxySorter>(ProxySorter(cost)); 

tôi nhận được không lỗi và mọi thứ hoạt động như mong đợi. Nhưng điều này có vẻ bị tấn công và cẩu thả.

Tuy nhiên, đây là rõ ràng bất hợp pháp:

std::set<unsigned, ProxySorter> node_queue(ProxySorter(cost)); 

Cố gắng chỉ xây dựng nó với ProxySorter (chi phí) gây ra một loạt các sai sót, nói những thứ như thế này cho mỗi cuộc gọi thành viên thiết lập:

error: request for member erase in node_queue, which is of non-class type std::set<unsigned int, ProxySorter>(ProxySorter)

Vấn đề với việc xây dựng thường xuyên là gì? Tại sao công việc được giao? Sự khác biệt ở đây mà tôi đang thiếu là gì? Bất kỳ trợ giúp đánh giá cao, cảm ơn.

Oh và xin lỗi về tiêu đề của câu hỏi, tôi đã không thực sự chắc chắn những gì để gọi này.

Trả lời

13

Most-vexing-parse. Bạn cần một cặp ngoặc đơn:

std::set<unsigned, ProxySorter> node_queue((ProxySorter(cost))); 

khác nó sẽ được hiểu là việc kê khai của một hàm trả về kiểu thiết lập của bạn và tham gia một cuộc tranh cãi kiểu ProxySorter tên cost.

+0

Lý do, vì nếu không nó được phân tích cú pháp dưới dạng khai báo hàm? Wow. –

+0

Chà. Tôi chưa bao giờ nghĩ ra điều đó. –

+0

@ John: Có, hãy xem bản chỉnh sửa nhỏ của tôi và liên kết. – Xeo

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