是否可以将模板的所有实例化 class 声明为相互好友?
Is it possible to declare all instantiated class of a template to be friend mutually?
假设我有一个模板(助手)class,我想使模板的所有实例化 class 成为友元(这样我就可以将一些静态成员函数隐藏为私有,即使他们偶尔会在内部切换模板参数)。
像这样:
template </* some types */>
class Foo {
template </* same as above types */>
friend class Foo</* template arguments */>;
// ...
};
但是,这不会编译,因为 gcc 警告我我正在专门化一些不允许的模板(必须出现在名称空间范围内)。我不想专精任何东西...
有什么办法吗?
最初,由于有很多参数,我试图使用可变参数模板来节省一些输入,但这被编译器认为是专门化的。虽然后来我切换回键入所有参数,但会调用显式特化(保留 <>
)。
最原始的代码:
template <class... Ts>
friend class Foo<Ts...>;
是的,只要使用正确的 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
};
假设我有一个模板(助手)class,我想使模板的所有实例化 class 成为友元(这样我就可以将一些静态成员函数隐藏为私有,即使他们偶尔会在内部切换模板参数)。
像这样:
template </* some types */>
class Foo {
template </* same as above types */>
friend class Foo</* template arguments */>;
// ...
};
但是,这不会编译,因为 gcc 警告我我正在专门化一些不允许的模板(必须出现在名称空间范围内)。我不想专精任何东西...
有什么办法吗?
最初,由于有很多参数,我试图使用可变参数模板来节省一些输入,但这被编译器认为是专门化的。虽然后来我切换回键入所有参数,但会调用显式特化(保留 <>
)。
最原始的代码:
template <class... Ts>
friend class Foo<Ts...>;
是的,只要使用正确的 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
};