[英]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.