Declaration of friendship to a template class doesn't work
See the example below, taken from this notebook from C++ training.
This is cppyy which is at fault here: this is perfectly legit C++ code which for instance works in Coliru and also worked with Xeus-cling.
An issue should be opened on cppyy project.
import cppyy
code1 = """
template<class T>
class HoldAValue4
{
public:
HoldAValue4(T value);
// 'Repeating' the list of template arguments and not using the ones from the class will fix the issue...
// T wouldn't have work here; the label MUST differ.
template<class U>
friend void Print(const HoldAValue4<U>& obj);
private:
T value_;
};
"""
cppyy.cppexec(code1)
code1 = """
template<class T>
HoldAValue4<T>::HoldAValue4(T value)
: value_(value)
{ }
"""
cppyy.cppexec(code1)
code1 = """
#include <iostream>
// Notice it is only a label: in the definition I'm free to use the same label as for the class definitions!
template<class T>
void Print(const HoldAValue4<T>& obj)
{
std::cout << "Underlying value is " << obj.value_ << std::endl;
}
"""
cppyy.cppexec(code1)
code1= """
{
HoldAValue4<int> hold(5);
Print(hold); // Ok!
}
"""
cppyy.cppexec(code1)
Edited by GILLES Sebastien