7

这是如何运作的?它与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>());
4

1 回答 1

13
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,但您的结构不提供任何从Atoint的转换,因此不提供错误。

如果您提供适当的转换,那么它也将起作用。像

operator int(){return 1;}
于 2012-09-05T04:37:30.280 回答