C++ 在模板中使用好友
我正在编写一个小类,该类基本上是C类的工厂,但我希望其他类能够访问一些方法C++ 在模板中使用好友,c++,templates,gcc,C++,Templates,Gcc,我正在编写一个小类,该类基本上是C类的工厂,但我希望其他类能够访问一些方法 template<class C> class CFactory { public: friend class C; }; 模板 类工厂{ 公众: C类朋友; }; 这应该使C类可以使用CFactory的字段,但编译器不这么认为 我在mac上使用gcc时遇到以下两个错误 错误:在“类”之后使用模板类型参数“C” 错误:友元声明未命名类或函数 谁能告诉我我做错了什么以及如何纠正et吗?C可以是任
template<class C>
class CFactory {
public:
friend class C;
};
模板
类工厂{
公众:
C类朋友;
};
这应该使C类可以使用CFactory的字段,但编译器不这么认为
我在mac上使用gcc时遇到以下两个错误
错误:在“类”之后使用模板类型参数“C”
错误:友元声明未命名类或函数
谁能告诉我我做错了什么以及如何纠正et吗?
C
可以是任何东西-int
,double
,等等,它们不是类。一般来说,该类别C
不是类别
。你不能有这样的东西:
class A
{
friend class int;
//..
};
使用
模板s时,选择typename
而不是class
的另一个原因是不幸的是,据我所知,这在当前标准中是不允许的。
§7.1.5.3/2规定:
[注意:…在类模板中
对于模板类型参数T
声明
朋友类T;
格式不正确。-尾注]
另一方面,这个限制似乎在C++0x中被删除了
(§N3290中的11.3/3)。
顺便说一句,MSVC
如果我们只写friend T代码>Ise的回答是正确的——包含一个关于此问题的更详细问题
然而,也许您可以尝试一个额外的间接模板,这可能会奏效?大概是这样的:
template <typename T>
struct FriendMaker
{
typedef T Type;
};
template <typename T>
class CFactory
{
public:
friend class FriendMaker<T>::Type;
};
模板
结构交友者
{
T型;
};
模板
类工厂
{
公众:
friend类FriendMaker::Type;
};
这似乎只适用于gcc 4.5.x,因此我不会依赖它。如何告诉模板C是一个类?这对我来说没有多大意义。如果使用非类实例化模板,编译器可能会生成错误。毕竟,在大多数情况下模板就是这样工作的。你说得对,但这似乎是不允许的。我的VS2010说:typename'不是一个“类”
即使我在模板中使用了class
?没有办法确保模板参数实际上是一个类吗?也许在c++x0中?您真正想做什么?什么样的模板要求其模板参数实际上是一个类?是的,“friend T;”在C++11中: