这是如何运作的?它与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>());
这是如何运作的?它与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>());
f(new A<void*>());
由于Argument 依赖查找/Koenig 查找( ADL )
Koenig Lookup 状态,确实有效:
如果在函数的命名空间中定义了一个或多个参数类型,则不必限定函数的命名空间(范围)。
考虑一个不使用模板的简单示例,它应该可以帮助您更好地理解 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()
需要 type 的参数int
,但您的结构不提供任何从A
toint
的转换,因此不提供错误。
operator int(){return 1;}