Я использую новый шаблон. Как заголовок, у меня есть классы без шаблона (Obj и ObjBase) и класс шаблона PItem. Я хочу, чтобы PITem :: RefValue () обращался к частным членам в Obj.
Я думал, что ниже будет работать:
template<class T> friend int PItem<T>::getValue();
Это не означает:
ошибка C2248: 'Obj :: getValue': не может получить доступ к частному члену, объявленному в классе 'Obj'
note: см. ссылку на экземпляр экземпляра функции 'int PItem :: getValue (void)', скомпилированный
Жалобы компилятора:
if (ptr) return ptr->getValue();
class ObjBase
{
public:
ObjBase() {}
~ObjBase(){}
protected:
int value{0};
};
class Obj : public ObjBase
{
template<class T>
class PItem;
template<class T>
friend int PItem<T>::getValue();
public:
Obj(int i) { value = i; };
~Obj() {};
private:
int getValue()
{
return value;
}
};
template<typename T>
class PItem
{
public:
PItem(T* t) { ptr = t; }
~PItem() {}
int getValue() {
if (ptr) return ptr->getValue();
return -1;
}
T* ptr;
};
Всего 1 ответ
Вы объявляете вложенный шаблон шаблона PItem
внутри Obj
, тогда декларация friend
относится к нему, а не та, которая определена в области globle.
Вы должны удалить декларацию шаблона вложенного класса и перенести определение 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;
}
};