这是如何工作的?它与ADL有关吗?
#include <iostream>
template <typename T>
struct A
{
friend void f(T x)
{
std::cout << "A\n";
}
};
int main()
{
f(new A<void*>());
}
有人可以告诉我为什么我不能使用像
这样的东西f(A<int>());
答案 0 :(得分:13)
f(new A<void*>());
确实有效,因为 Argument dependent lookup/Koenig lookup ( ADL ) Koenig Lookup说:
如果在函数的命名空间中定义了一个或多个参数类型,则不必为函数限定命名空间(范围)。
考虑simplistic example不使用模板,它可以帮助您更好地理解ADL:
#include <iostream>
struct A
{
friend void f(A x)
{
std::cout << "A\n";
}
};
int main()
{
f(A());
return 0;
}
输出
A
当您使用f(A<int>())
时,它要求f()
需要int
类型的参数,但您的结构不提供从A
到{{1}的任何转换因而错误。
If you provide the appropriate conversion then it will work as well. Something like:
int