Использование друга в шаблонах
Я пишу небольшой класс, класс в основном представляет собой factory для класса C, но я хочу, чтобы другие классы могли получить доступ к некоторым из методов.
template<class C>
class CFactory {
public:
friend class C;
};
Это должно сделать поля CFactory доступными для класса C, но компилятор думает иначе.
Я получаю следующие две ошибки, используя gcc на mac.
error: использование параметра типа шаблона 'C' после 'класса'
error: объявление друга не называет класс или функцию
Может ли кто-нибудь сказать мне, что я делаю неправильно, и как правильно получить et?
Ответы
Ответ 1
Ответ Ise верный - Часто задаваемые вопросы Комо содержит более подробный вопрос по этой проблеме.
Однако, возможно, вы можете попробовать дополнительную ссылку на шаблон, которая может работать? Что-то вроде этого:
template <typename T>
struct FriendMaker
{
typedef T Type;
};
template <typename T>
class CFactory
{
public:
friend class FriendMaker<T>::Type;
};
Похоже, что это работает только с gcc 4.5.x, поэтому я бы не стал полагаться на него.
Ответ 2
К сожалению, в моем понимании это не разрешено в текущем стандарте.
В §7.1.5.3/2 говорится:
[Примечание:... внутри шаблона класса с параметром типа шаблона T, объявление
класс друга T;
плохо сформирован. -end note]
В соответствующей заметке это ограничение, похоже, удаляется в С++ 0x
(§11.3/3 в N3290).
Кстати, MSVC
может разрешить это, если мы просто напишем friend T;
.
Ответ 3
C
может быть любым - int
, double
и т.д., и они не являются классами. В общем случае это class C
не class
. И вы не можете иметь что-то вроде:
class A
{
friend class int;
//..
};
Еще одна причина предпочесть typename
вместо class
при использовании template
s