Можно ли вызвать введенную функцию шаблона друга? - PullRequest
0 голосов
/ 12 января 2019

Чтобы соответствовать другим (не шаблонным) функциям в классе, я хотел определить и вызвать шаблонную функцию друга.

Я могу определить его без проблем (см. Функцию 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.

1 Ответ

0 голосов
/ 12 января 2019

Что вам нужно, чтобы это работало, - это пара предварительных деклараций.

Две следующие строки кода должны находиться перед пространством имен ns.

struct S; //Needed because S is used as a parameter in the function template
template<class T> void t(S const&);

И тогда эта форма вызова будет работать внутри main.

t<int>(s);

См. Демо здесь .

...