2011-07-30 36 views
15

Hãy xem xét các chương trình sau đây:Tôi nên xác định toán tử >> ở đâu để chuyên môn hóa std :: pair?

#include <iostream> 
#include <iterator> 
#include <vector> 
#include <utility> 
using namespace std; //just for convenience, illustration only 

typedef pair<int, int> point; //this is my specialization of pair. I call it point 

istream& operator >> (istream & in, point & p) 
{ 
    return in >> p.first >> p.second; 
} 

int main() 
{ 
    vector<point> v((istream_iterator<point>(cin)), istream_iterator<point>()); 
    //    ^^^       ^^^   
    //extra parentheses lest this should be mistaken for a function declaration 
} 

này thất bại trong việc biên dịch, vì càng sớm càng ADL thấy operator >> trong namespace std nó không xem xét phạm vi toàn cầu nữa cho dù các nhà điều hành tìm thấy trong std là một ứng cử viên khả thi hay không. Điều này khá bất tiện. Nếu tôi đặt tuyên bố của toán tử >> vào không gian tên std (về mặt kỹ thuật bất hợp pháp) thì mã sẽ biên dịch tốt như mong đợi. Có cách nào để giải quyết vấn đề này khác hơn làm cho point lớp của riêng tôi hơn là typedefing nó như là một chuyên môn của một mẫu trong không gian tên std?

Cảm ơn trước

+0

You are not chuyên 'std :: pair' đây. Tôi nghĩ rằng điều này có nhiều hơn để làm với cách mã templated được phân tích cú pháp hơn với ADL chính nó. –

Trả lời

11

Thêm một tình trạng quá tải của operator>> trong namespace std bị cấm, nhưng thêm một mẫu chuyên môn đôi khi được cho phép.

Tuy nhiên, không có loại do người dùng xác định ở đây và các toán tử trên các loại tiêu chuẩn không phải của bạn để xác định lại. Chuyên môn operator>>(istream&, pair<mytype, int>) sẽ là hợp lý.


phần [namespace.std] (phần 17.6.4.2.1 của n3290) nói

Hành vi của một chương trình C++ là undefined nếu nó thêm tuyên bố hoặc định nghĩa để không gian tên std hoặc một không gian tên trong namespace std trừ khi được quy định khác. Chương trình có thể thêm chuyên môn mẫu cho bất kỳ mẫu thư viện chuẩn nào vào không gian tên std chỉ khi khai báo phụ thuộc vào kiểu người dùng được xác định và chuyên môn đáp ứng các yêu cầu thư viện chuẩn cho mẫu ban đầu và không bị cấm rõ ràng.

(tôi nhấn mạnh)

+0

Câu trả lời của bạn có ngụ ý rằng câu trả lời cho câu hỏi của tôi là *** không *** và tôi nên đặt 'điểm' thành một lớp riêng biệt? –

+0

Nói cho Ben Voigt, tôi muốn nói rằng có, nó có. –

+0

@Benoit: Nhân tiện, tôi không hiểu rằng các toán tử trên các loại tiêu chuẩn không phải là của tôi để _re_define. Không có toán tử >> cho cặp, vì vậy tôi không _re_defining bất cứ điều gì, tôi? –

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