c ++ не шаблонные друзья класса к члену шаблонного класса - PullRequest
0 голосов
/ 09 ноября 2018

Я новичок в использовании шаблона. В качестве заголовка у меня есть не шаблонные классы (Obj и ObjBase) и шаблонный класс PItem. Я хочу разрешить PITem :: RefValue () получать доступ к закрытым членам в Obj.

Я думал, что ниже будет работать:

   template<class T>
   friend int PItem<T>::getValue();

Это не так:

ошибка C2248: 'Obj :: getValue': невозможно получить доступ к закрытому члену, объявленному в классе 'Obj'

примечание: см. Ссылку на экземпляр шаблона функции '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 Ответ

0 голосов
/ 09 ноября 2018

Вы объявляете вложенный шаблон класса 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;
    }
};

ЖИТЬ

...