Подтвердить что ты не робот

Использование друга в шаблонах

Я пишу небольшой класс, класс в основном представляет собой factory для класса C, но я хочу, чтобы другие классы могли получить доступ к некоторым из методов.

template<class C>
class CFactory {
public:   
   friend class C;
};

Это должно сделать поля CFactory доступными для класса C, но компилятор думает иначе.

Я получаю следующие две ошибки, используя gcc на mac.

error: использование параметра типа шаблона 'C' после 'класса'

error: объявление друга не называет класс или функцию

Может ли кто-нибудь сказать мне, что я делаю неправильно, и как правильно получить et?

4b9b3361

Ответ 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