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;.
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但是我不会依赖它.