c++ - 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;
};
解决方案
你在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;
}
};
推荐阅读
- sql - 如何在sql中组合like和between?
- magento - 在 Magento 的“元关键字掩码”中添加细节
- java - CompletableFuture 在我执行获取并引发异常时会自动取消吗?
- javascript - Jquery将许多选项选择组合到多行的一个输入中并组合总和
- javascript - 从数组中获取一天中的最低和最高时间
- angular - 在 Angular 中获取嵌套的响应式表单值?
- python - 一个锁定的测试用例显示运行时错误
- json - 我在 JSON 文件中遇到意外错误
- reactjs - 如何在反应模式中传递道具
- php - Laravel phpspreadsheet 使用 ajax 传递数据