为了与类中的其他(非模板)函数保持一致,我想定义并调用一个朋友模板函数。
我可以毫无问题地对其进行定义(请参见下面的功能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进行了测试。
答案 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。