c++ non-template class 模板成员的朋友 class
c++ non-template class friends to a member of template class
我是模板新手。作为标题,我有一个 non-template classes(Obj 和 ObjBase)和一个模板 class PItem。我想让 PITem::RefValue() 访问 Obj.
中的私有成员
我认为下面的方法可行:
template<class T>
friend int PItem<T>::getValue();
它没有:
error C2248: 'Obj::getValue': cannot access private member declared in class 'Obj'
note: see reference to function template instantiation 'int PItem::getValue(void)' being compiled
编译器投诉:
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
内声明了一个嵌套的 class 模板 PItem
,然后 friend
声明引用了它,而不是全局范围内定义的模板。
您应该删除嵌套的class模板声明,并将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;
}
};
我是模板新手。作为标题,我有一个 non-template classes(Obj 和 ObjBase)和一个模板 class PItem。我想让 PITem::RefValue() 访问 Obj.
中的私有成员我认为下面的方法可行:
template<class T> friend int PItem<T>::getValue();
它没有:
error C2248: 'Obj::getValue': cannot access private member declared in class 'Obj'
note: see reference to function template instantiation 'int PItem::getValue(void)' being compiled
编译器投诉:
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
内声明了一个嵌套的 class 模板 PItem
,然后 friend
声明引用了它,而不是全局范围内定义的模板。
您应该删除嵌套的class模板声明,并将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;
}
};