Чтобы соответствовать другим (не шаблонным) функциям в классе, я хотел определить и вызвать шаблонную функцию друга.
Я могу определить его без проблем (см. Функцию t
ниже).
namespace ns{
struct S{
void m() const{}
friend void f(S const&){}
template<class T>
friend void t(S const&){}
};
template<class T>
void t2(S const& s){}
}
Однако позже я никак не могу вызвать эту t
функцию?
int main(){
ns::S s;
s.m();
f(s);
// t<int>(s); // error: ‘t’ was not declared in this scope (I was expecting this to work)
// ns::t<int>(s); // error: ‘t’ is not a member of ‘ns’
// ns::S::t<int>(s); // error: ‘t’ is not a member of ‘ns::S’
}
Даже если это вообще невозможно, я удивлен, что мне позволено это определить.
Я проверил это с gcc 8 и clang 7.