c++ non-template class 模板成员的朋友 class

c++ non-template class friends to a member of template class

我是模板新手。作为标题,我有一个 non-template classes(Obj 和 ObjBase)和一个模板 class PItem。我想让 PITem::RefValue() 访问 Obj.

中的私有成员

我认为下面的方法可行:

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

它没有:

error C2248: 'Obj::getValue': cannot access private member declared in class 'Obj'

note: see reference to function template instantiation 'int PItem::getValue(void)' being compiled

编译器投诉:

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

您在 Obj 内声明了一个嵌套的 class 模板 PItem,然后 friend 声明引用了它,而不是全局范围内定义的模板。

您应该删除嵌套的class模板声明,并将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;
    }
};

LIVE