是否可以将模板的所有实例化 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
};