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

时间:2019-01-12 09:35:43

标签: c++ c++11 friend function-templates

为了与类中的其他(非模板)函数保持一致,我想定义并调用一个朋友模板函数。

我可以毫无问题地对其进行定义(请参见下面的功能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 :(得分:1)

要使此工作有效,您需要几个前向声明。

以下两行代码应位于命名空间WHILE之前。

ns

然后这种呼叫方式将在struct S; //Needed because S is used as a parameter in the function template template<class T> void t(S const&); 内部起作用。

main

请参见演示here