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
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ó. –