在模板中使用朋友

时间:2011-06-12 09:21:48

标签: c++ templates gcc

我正在编写一个小类,该类基本上是C类的工厂,但我希望其他类能够访问某些方法。

template<class C>
class CFactory {
public:   
   friend class C;
};

这应该使CFactory的字段可用于C类,但编译器认为不然。

我在Mac上使用gcc时遇到以下两个错误。

  

错误:在'class'之后使用模板类型参数'C'

     

错误:朋友声明没有命名类或函数

任何人都可以告诉我我做错了什么以及如何做对吗?

3 个答案:

答案 0 :(得分:12)

不幸的是,根据我的理解,目前的标准不允许这样做 §7.1.5.3/ 2说:

  

[注意:......在课堂模板中   使用模板类型参数T,   声明
  朋友班T;
  是不正确的。 - 后注]

在相关的说明中,这个限制似乎在C ++ 0x中被删除了 (N3290中的§11.3/ 3) 顺便说一句,MSVC如果我们只写friend T;就可以允许这样做。

答案 1 :(得分:5)

Ise的回答是正确的 - Comeau's FAQ更详细地包含了有关此问题的问题。

但是,也许您可​​以尝试一个可能有用的额外模板间接寻址?像这样:

template <typename T>
struct FriendMaker
{
    typedef T Type;
};

template <typename T>
class CFactory
{
public:
    friend class FriendMaker<T>::Type;
};

这似乎只适用于gcc 4.5.x但是我不会依赖它。

答案 2 :(得分:3)

C可以是任何内容 - intdouble等,而且它们不是类。通常,此class C不是class。你不可能有这样的东西:

class A
{
    friend class int;
    //..
};

使用typename时更喜欢class而不是template的另一个理由