这是一个例子:
#include#include #include using std::string; int main() { string str = "This is a string"; // ok: needn't using declaration, ADL works auto it = find(str.begin(), str.end(), 'i'); // error: why ADL doesn't work? std::shared_ptr sp = make_shared (str); }
当我试图编译这个程序时,编译器抱怨:
error: no template named 'make_shared'; did you mean 'std::make_shared'? std::shared_ptrsp = make_shared (str); // error... ^~~~~~~~~~~ std::make_shared
我猜第一个函数find
不需要using
声明,因为依赖于参数的lookup(ADL
):编译器会搜索名称空间string
(即std
)的定义find
.但对于第二个函数make_shared
,它似乎ADL
不起作用:我必须使用std::make_shared
或using
声明.我知道两个函数模板的定义是不同的:前者将其模板参数之一(typename T
或类似的东西)作为函数参数类型并返回相同的类型.后者将函数参数包作为函数参数,其返回类型是另一个模板参数.禁用这个区别ADL
吗?或者你能帮助回答这个问题并提供一些参考资料吗?