是否可以调用注入的朋友模板函数?

Is it possible to invoke an injected friend template function?

为了与 class 中的其他(非模板)函数保持一致,我想定义和调用友元模板函数。

我可以毫无问题地定义它(参见下面的函数 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 测试了这个。

你需要做的是几个前向声明。

下面两行代码应该在命名空间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);

查看演示 here