2009-09-22 4 views
9

Я пытаюсь получить доступ к защищенным переменным класса шаблона с разными параметрами шаблона. Друг декларацию с параметрами шаблона дает следующее сообщение об ошибке:Шаблон для дружбы

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

Мой код

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; 
}; 

Если удалить заявление о защите и друга он работает.

+0

MyClass является его другом? !! – AraK

+3

MyClass не тот же класс, что и MyClass , поэтому он не может получить доступ к его защищенным переменным. –

+0

AraK нет такого «MyClass». –

ответ

10

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

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

например.

template< class A, class B > friend class MyClass; 
0

Кажется, что работает, эффективно объявляя, что все типы 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; 
}; 
Смежные вопросы