【发布时间】:2011-07-30 18:14:28
【问题描述】:
考虑以下程序:
#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 设为我自己的类而不是将其定义为 std 命名空间中模板的特化之外,还有什么方法可以解决此问题?
提前致谢
【问题讨论】:
-
您在这里没有专门针对
std::pair。我认为这与模板化代码的解析方式有关,而不是与 ADL 本身有关。
标签: c++ stl template-specialization argument-dependent-lookup