11

I'm trying to access protected variables of a template class with different template parameters. A friend declaration with template parameters is giving the following error:

multiple template parameter lists are not allowed

My code is

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

If I remove the protection and friend declaration it works.

Martin B
  • 23,670
  • 6
  • 53
  • 72
Cem Kalyoncu
  • 14,120
  • 4
  • 40
  • 62

2 Answers2

13

From the standard: 14.5.3/9 [temp.friend], "A friend template shall not be declared partial specializations.", so you can only 'befriend' all instantiations of a class template or specific full specializations.

In your case, as you want to be friends with instantiations with one free template parameter, you need to declare the class template as a friend.

e.g.

template< class A, class B > friend class MyClass;
CB Bailey
  • 755,051
  • 104
  • 632
  • 656
0

The following seems to be working, effectively declaring all MyClass types to be friend with each other.

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;
};
Cem Kalyoncu
  • 14,120
  • 4
  • 40
  • 62