Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在模板中使用好友_C++_Templates_Gcc - Fatal编程技术网

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可以是任

我正在编写一个小类,该类基本上是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中: