假设我有一个模板(帮助器)类,我想让模板的所有实例化类都成为朋友(所以我可以将一些静态成员函数隐藏为私有,即使它们偶尔会在里面切换模板参数)。
像这样:
template </* some types */>
class Foo {
template </* same as above types */>
friend class Foo</* template arguments */>;
// ...
};
然而,这不会编译,因为gcc警告我,我专门研究一些不允许的模板(必须出现在命名空间范围内)。我没有尝试专门做任何事......
有什么办法吗?
最初,由于有很多参数,我试图使用可变参数模板来保存一些输入,但这被编译器认为是专门化的。虽然后来我切换回所有参数,但是调用了显式特化(保留了<>
)。
非常原始的代码:
template <class... Ts>
friend class Foo<Ts...>;
答案 0 :(得分:9)
是的,你可以,只需使用正确的template friends declaration语法。例如(解释写在评论中)
template <T>
class Foo {
// declare other instantiations of Foo to be friend
// note the name of the template parameter should be different with the one of the class template
template <typename X>
friend class Foo; // no </* template arguments */> here, otherwise it would be regarded as template specialization
};