是否可以将模板的所有实例化类声明为相互的朋友?

时间:2016-12-16 03:34:59

标签: c++ templates friend

假设我有一个模板(帮助器)类,我想让模板的所有实例化类都成为朋友(所以我可以将一些静态成员函数隐藏为私有,即使它们偶尔会在里面切换模板参数)。

像这样:

template </* some types */>
class Foo {
    template </* same as above types */>
    friend class Foo</* template arguments */>;
    // ...
};

然而,这不会编译,因为gcc警告我,我专门研究一些不允许的模板(必须出现在命名空间范围内)。我没有尝试专门做任何事......

有什么办法吗?

最初,由于有很多参数,我试图使用可变参数模板来保存一些输入,但这被编译器认为是专门化的。虽然后来我切换回所有参数,但是调用了显式特化(保留了<>)。

非常原始的代码:

template <class... Ts>
friend class Foo<Ts...>;

1 个答案:

答案 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
};