繁体   English   中英

使模板参数成为模板类的朋友

[英]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必须将您的模板声明为朋友。 关于友谊的决定由提供友谊的班级做出; 不能从另一个班级要求它。 没有朋友的声明,就没有合法的方法可以从外部获取课程的私人部分。 那就是私人的意思。

第一件事是,正如其他人提到的那样,友谊不是对称的,并且您正在尝试错误的方向(授予Adebugprinter<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM