提问者:小点点

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

共1个答案

匿名用户

您在obj中声明了一个嵌套类模板pitem,然后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;
    }
};

活着

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|非|模板|类|好友|模板|类|成员)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?