Вы объявляете вложенный шаблон класса PItem
внутри Obj
, тогда к нему относится объявление friend
, а не то, которое определено в глобальном объеме.
Вы должны удалить объявление шаблона вложенного класса и переместить определение PItem
перед определением Obj
; потому что объявление friend
требует, чтобы PItem
был полным типом.
template<typename T>
class PItem
{
public:
PItem(T* t) { ptr = t; }
~PItem() {}
int getValue() {
if (ptr) return ptr->getValue();
return -1;
}
T* ptr;
};
class Obj : public ObjBase
{
template<class T>
friend int PItem<T>::getValue();
public:
Obj(int i) { value = i; };
~Obj() {};
private:
int getValue()
{
return value;
}
};
ЖИТЬ