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