如何在模板友元函数中获取对象指针?编译错误求助
解决友元模板函数中获取对象指针的编译错误
我来帮你搞定这个头疼的编译问题!你遇到的错误根源在于模板函数里调用GetSelfPtr()的方式不对,编译器没法定位到这个类的私有成员函数。
错误原因分析
先看你templt.h里的代码:
template <typename some_type_t> void foo(some_type_t &val) { GetSelfPtr()->x; }
这里直接写GetSelfPtr(),编译器会默认把它当成全局函数去查找,但全局作用域里根本没有这个函数。虽然foo是A和B的友元,但编译器不知道这个函数属于some_type_t类——因为你的调用没有和模板参数some_type_t关联起来,它不会主动去对应类的作用域里找这个成员函数,这就导致了编译报错。
修复方案
只需要通过传入的val对象来调用GetSelfPtr()就行!这样编译器会明确知道这个函数是val所属类的成员,会去A或B的作用域里查找,而且因为foo是友元,完全有权限访问这个私有函数。
修改后的templt.h代码如下:
template <typename some_type_t> void foo(some_type_t &val) { val.GetSelfPtr()->x; }
补充说明
别想着用this哦——foo是全局模板函数,不是类的成员函数,所以不能直接用this指针。必须通过传入的对象实例来调用类的成员函数。修改后编译就能正常通过啦!
内容的提问来源于stack exchange,提问作者HeyHo
相关产品推荐
相关产品推荐

