5

我有一个班级模板

template< typename G, int N > class Foo { /* ... */ };

我希望专业化N=0成为另一个班级的朋友,但我不知道它的语法(我自己也找不到)。我试过了:

template< typename T >
class Bar {
  template< typename G > friend class Foo< G, 0 >;

  /* ... */
};

我希望任何类型Foo< G, 0 >的 G 都成为class Bar< T >. 什么是正确的语法?

谢谢!

4

2 回答 2

2

在 C++03 中这是不可能的;C++ 标准 14.5.3/9 说明如下:

友元声明不得声明部分特化。

如另一个答案中所述,此问题可能有一些解决方法,但您要求的特定功能在该标准中不可用。

幸运的是,现在 C++11 得到了很好的支持,并且通过指定模板别名的能力,我们可以做到这一点:

template <typename, typename> struct X{};

template <typename T> 
struct Y
{
    template <typename U> using X_partial = X<T, U>;
    template <typename> friend class X_partial;
};
于 2013-08-13T14:57:41.420 回答
1

如果没有 C++11,我认为你能做的最好的事情是一个假的类型别名,这可能需要一些代码(构造函数)复制(这可能无法解决你正在尝试的真正问题):

template< typename G, int N > class Foo { /* ... */ };

template<typename G> class FooAlias : public Foo<G, 0> { };

template< typename T >
class Bar {
  template< typename G > friend class FooAlias;

  /* ... */
};
于 2013-08-13T15:01:25.980 回答