簡體   English   中英

C ++非模板類的朋友成為模板類的成員

[英]c++ non-template class friends to a member of template class

我是新來的模板。 作為標題,我有一個非模板類(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;
};

您要在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;
    }
};

生活

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM