是否可以调用注入的朋友模板函数?
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。
为了与 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。