首页 > 解决方案 > c++非模板类好友到模板类成员

问题描述

我是使用模板的新手。作为标题,我有一个非模板类(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;
};

标签: c++templatesfriend

解决方案


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

居住


推荐阅读