Как это работает? Это связано с 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*>());
Действительно работает из-за Поиск, зависящий от аргумента / поиск Кенига(ADL)
Поиск Кенига гласит:
Вам не нужно указывать пространство имен (область) для функций, если в пространстве имен функции определен один или несколько типов аргументов.
Рассмотрим упрощенный пример не использовать шаблоны, и это должно помочь вам лучше понять 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
в int
и, следовательно, ошибка.
Если вы предоставите соответствующее преобразование, то оно также будет работать. Что-то вроде:
operator int(){return 1;}
Других решений пока нет …