[英]Making a template parameter as friend of template class
我正在调试与第三方库交互的应用程序,该库的代码不可用,只有标头和.so可用。 现在,我可以将其加载到调试器中,并检查在第三方库中声明的类的私有成员的变量值,但是由于对象数量巨大,我想创建某种机制在控制台上打印它,以便稍后进行分析。 我想出了这样的东西
ThirdPartyHeader
class A
{
private:
int i;
};
我没有在上课中包含额外的细节
Debugprinter.cpp
#include <thirdpartheaders>
template <typename T> class debugprinter
{
friend class T;
public :
void printonconsole()
{
T a;
std::cout << std::endl << a.i << std::endl;
return;
}
}
现在,我尝试在此之上进行编译,但似乎无法将未定义的类型T声明为我的模板类的朋友,并得到此错误
错误:无法从x :: acc()访问我
现在,我可以通过创建非模板debugprinter来解决此问题,但是出于好奇,我是否有办法创建一个模板类,该类对它的输入类型参数很感兴趣?
谢谢
将A
声明为debugprinter<A>
的朋友并没有帮助。 friend
关系不是对称的。 这种关系只是单向的。 如果要访问A
私有成员,则需要debugprinter<A>
成为A
的朋友。 为此,您需要修改A
类本身。
就像现实世界中的友谊一样。 你不能强迫别人成为你的朋友。 你只能表现得对他人友善。
您可以将T
声明为朋友,但这对您没有任何好处。 所需要的是让您的模板获取T
中的私有数据的方法,而这又是另一回事: T
必须将您的模板声明为朋友。 关于友谊的决定由提供友谊的班级做出; 不能从另一个班级要求它。 没有朋友的声明,就没有合法的方法可以从外部获取课程的私人部分。 那就是私人的意思。
第一件事是,正如其他人提到的那样,友谊不是对称的,并且您正在尝试错误的方向(授予A
对debugprinter<A>
A
访问权。这就是说,只是为了使人们搜索问题:
在旧版标准(C ++ 03)中,不可能直接将模板参数声明为好友。 尽管它需要稍微不同的语法,但在C ++ 11中取消了该限制:
template <typename T>
class test {
friend T; // note, not 'friend class T'!!!
};
尽管如此,在C ++ 03中,您可以通过使用一种额外的间接级别来实现相同的行为。 您不能与模板参数成为朋友,但可以与从属类型成为朋友,并且通过使用identity
元函数,可以实现所需的功能:
template <typename T>
struct identity {
typedef T type;
};
template <typename T>
class test {
friend class identity<T>::type;
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.