C ++中的专业好友功能

时间:2016-01-14 15:17:12

标签: c++ templates template-specialization specialization partial-specialization

我有一个函数模板foo,它必须执行不同的计算,具体取决于模板参数是实数还是复数。在任何情况下,结果都是实数,例如double,即使模板参数为std::complex<double>。因此,我的功能如下:

template <class S>
struct RealType
{
  typedef S type;
};

template <class S>
struct RealType<std::complex<S> >
{
  typedef S type;
};

template <class S>
class C;

template <class S>
typename RealType<S>::type foo(C<S> &c);

template <class S>
typename RealType<std::complex<S> >::type foo(C<std::complex<S> > &c);

现在foo必须是类C的友方函数,所以我做了以下声明:

template <class S>
class C
{
  friend typename RealType<S>::type foo(C<S> &c);
  // ...
};

但是,当我实例化C<std::complex<double> >时,编译器会说foo无法访问c的私有成员。它适用于C<double>。有没有解决方案(适用于C ++ 98)?我了解foo不能成为C的成员,因为这会阻止部分专业化。

顺便说一句:这真的是专业吗? foo两个版本的签名看起来都一样,但实际上插入真实类型时它们有些不同。

1 个答案:

答案 0 :(得分:0)

确保在宣布 class C之后foo声明foo朋友

您可能需要使用前向声明:

template <class S> class C;

// foo declarations here

template <class S> class C 
{ 
    template<class X> friend typename RealType<X>::type foo(C<X> &c); // friend the template
    friend typename RealType<S>::type foo<>(C &c); // friend the specialization
};