在模板中使用朋友

Mar*_*sen 12 c++ gcc templates

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

template<class C>
class CFactory {
public:   
   friend class C;
};
Run Code Online (Sandbox Code Playgroud)

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

我在mac上使用gcc得到以下两个错误.

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

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

任何人都可以告诉我我做错了什么以及如何得到正确的?

Ise*_*ria 12

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

[注意:...在具有模板类型参数T的类模板中,声明
朋友类T;
是不正确的. - 尾注]

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


gre*_*olf 5

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

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

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

template <typename T>
class CFactory
{
public:
    friend class FriendMaker<T>::Type;
};
Run Code Online (Sandbox Code Playgroud)

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