我应该在哪里定义运算符>>用于我的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
}
这个编译失败了,因为只要ADL在命名空间std中找到操作符>>,它就不再考虑全局范围,无论在std中找到的操作符是否是可行的候选者。 这很不方便。 如果我将我的操作符>>的声明放入命名空间std(这在技术上是非法的),代码将按预期编译。 有什么办法来解决不是让其他的这个问题point
我自己的类,而不是typedefing它在std名字空间模板的一个特例?
提前致谢
禁止在namespace std
添加operator>>
的重载,但有时允许添加模板专用化。
但是,这里没有用户定义的类型,标准类型的操作符不是您需要重新定义的。 专门operator>>(istream&, pair<mytype, int>)
将是合理的。
部分[namespace.std]
(n3290的第17.6.4.2.1节)说
如果其添加声明或定义到命名空间一个C ++程序的行为是未定义std
命名空间内或一个命名空间std
除非另有规定。 只有当声明依赖于用户定义的类型并且专业化符合原始模板的标准库要求并且没有明确禁止时, 程序可以将任何标准库模板的模板专用化添加到名称空间std
。
(强调我的)
链接地址: http://www.djcxy.com/p/73063.html上一篇: Where should I define operator >> for my specialization of std::pair?