我正在编写一个小类,该类基本上是C类的工厂,但我希望其他类能够访问某些方法。
template<class C>
class CFactory {
public:
friend class C;
};
这应该使CFactory的字段可用于C类,但编译器认为不然。
我在Mac上使用gcc时遇到以下两个错误。
错误:在'class'之后使用模板类型参数'C'
错误:朋友声明没有命名类或函数
任何人都可以告诉我我做错了什么以及如何做对吗?
答案 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
可以是任何内容 - int
,double
等,而且它们不是类。通常,此class C
不是class
。你不可能有这样的东西:
class A
{
friend class int;
//..
};
使用typename
时更喜欢class
而不是template
的另一个理由