Шаблон дружбы - PullRequest
       8

Шаблон дружбы

10 голосов
/ 22 сентября 2009

Я пытаюсь получить доступ к защищенным переменным класса шаблона с различными параметрами шаблона. Объявление друга с параметрами шаблона выдает следующую ошибку:

несколько списков параметров шаблона не допускаются

Мой код

template<class O_, class P_> 
class MyClass {
    //multiple template parameter lists are not allowed
    template<class R_> friend class MyClass<R_, P_> 
    //syntax error: template<
    friend template<class R_> class MyClass<R_, P_> 

public:
    template<class R_>
    ACopyConstructor(MyClass<R_, P_> &myclass) :
       SomeVariable(myclass.SomeVariable)
    { }

protected:
    O_ SomeVariable;
};

Если я уберу декларацию защиты и друга, это сработает.

Ответы [ 2 ]

11 голосов
/ 22 сентября 2009

Из стандарта: 14.5.3 / 9 [temp.friend], «Шаблон друга не может быть объявлен частичной специализацией.», Поэтому вы можете «подружиться» только со всеми экземплярами шаблона класса или с конкретными полными специализациями.

В вашем случае, если вы хотите дружить с экземплярами с одним бесплатным параметром шаблона, вам нужно объявить шаблон класса как друга.

, например

template< class A, class B > friend class MyClass;
0 голосов
/ 22 сентября 2009

Следующее, кажется, работает, эффективно объявляя все типы MyClass дружественными друг другу.

template<class O_, class P_> 
class MyClass {
    template<class R_, class P_> friend class MyClass;

public:
    template<class R_>
    ACopyConstructor(MyClass<R_, P_> &myclass) :
       SomeVariable(myclass.SomeVariable)
    { }

protected:
    O_ SomeVariable;
};
...