不同编译器对成员函数指针的解读

t26502 2014-04-11 08:54:28
在THash.h中:

class TMemBase; //声明类                                                                

typedef int (TMemBase::*PFUNC)(void *, void *, void *);

class THash{

private:

void SetFunc(TMemBase *pbase, PFUNC pfunc, RFUNC rfunc, CFUNC cfunc);

TMemBase *m_pbase;

};


在TMemBase.h中:

#include "THash.h"  

class TMemBase{

private:

virtual int Print(void *key, void *val, void *data) = 0;

virtual int Check(void *key, void *val, void *pdata) = 0;

virtual void GetKVlen(size_t &klen, size_t &vlen) = 0;

void SetFunc();

PFUNC m_pfunc;

RFUNC m_rfunc;

CFUNC m_cfunc;

};


setFunc的实现:
void TMemBase::SetFunc()                                                        
{
PFUNC pfunc = &TMemBase::Print;
RFUNC rfunc = &TMemBase::UpVale;
CFUNC cfunc = &TMemBase::Check;

m_pfunc = (int (TMemBase::*)(void *, void *, void *))pfunc;
m_rfunc = (int (TMemBase::*)(void *, void *, void *))rfunc;
m_cfunc = (int (TMemBase::*)(void *, void *, void *))cfunc;

m_pMem->SetFunc(this, m_pfunc, m_rfunc, m_cfunc);
}



问题在THash类中使用传入的成员函数指针的时候,G++编译器下编译是没有问题的,在xlC编译器下出现如下问题:
"THash.cpp", line 94.31: 1540-0251 (S) The "->*" operator cannot be applied to the undefined class "class TMemBase".
"THash.cpp", line 140.34: 1540-0251 (S) The "->*" operator cannot be applied to the undefined class "class TMemBase".
"THash.cpp", line 144.52: 1540-0251 (S) The "->*" operator cannot be applied to the undefined class "class TMemBase".
"THash.cpp", line 259.36: 1540-0251 (S) The "->*" operator cannot be applied to the undefined class "class TMemBase".
"THash.cpp", line 282.36: 1540-0251 (S) The "->*" operator cannot be applied to the undefined class "class TMemBase".
其中94行代码如下:
int THash::FRelace(void *key, void *val, bool lock)                             
{
int ret = 0;
void *v = NULL;

_LOCK_KEY();
ret = m_shm->shb_find(key, (void **)&v); //第94行
if (ret == _SHM_HASH_FOUND) {
ret = (m_pbase->*m_rfunc)(key, v, val);
} else if (ret == _SHM_HASH_SYS_ERROR) {
ret = -2;
} else {
ret = m_shm->shb_add(key, val);
}
_UNLOCK_KEY();

return ret;
}



求大神指点!
...全文
270 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
t26502 2014-04-11
  • 打赏
  • 举报
回复
最后一段代码只是展示一下出错的位置,其实与程序大部分代码无关系,而且在G++下编译时没有问题的。 1、THash.h没有包含TMemBase.h,但是做了TMemBase类的声明; 2、THash.h中声明了TMemBase类的成员函数指针; 3、THash类中只定义了TMemBase的类对象指针,并没有使用到TMemBase类的成员和成员函数(指针除外); 1、TMemBase.h包含了THash.h; 2、TMemBase类定义了THash类的对象,也使用了THash类的方法; 3、成员函数指针在TMemBase类中是纯虚函数,在其子类中实现。 G++下是完全没有问题的。
妳是个好人 2014-04-11
  • 打赏
  • 举报
回复
代码贴全点,变量声明,函数声明 最后一段代码太模糊了
Qt源码剖析-智能指针 ⽬录 智能指针是什么? 智能指针是什么? 1. 智能指针是使⽤RAII技术(惯⽤⼿法)对裸指针进⾏封装、隔离、管理。 2. 把堆对象转移为栈对象。 为什么使⽤ 为什么使⽤QT智能 智能(smart)指针指针? CPP中在使⽤堆内存时我们必须使⽤指针,使⽤指针给我带来便利和强⼤的威⼒同时也给我们带来了很多隐患,所以指针也是把双刃剑。 常见的隐患有: 1. 我们在使⽤new创建⼀个对象的同时,由于种种原因⽽忘记了delete从⽽导致内存泄漏影响应⽤运⾏效率 2. 我们在使⽤⼀个指针的时候不知道该指针指向的对象是否已经析构,从⽽导致使⽤⼀个错误的野指针。 针对上述问题Qt提供⼀组类模板(Smart指针类)来管理C++中的裸指针, 同时提供相关重载运算符使得使⽤起来与指针操作⽆异。 指针的⽣ 命周期也交由Smart类来管理⽽不⽤程序员⾃⼰去⼿动管理。使⽤Smart指针进⽽避免了上述隐患的存在。 Qt提供了哪些智能指针? 提供了哪些智能指针? QPointer、QSharedPointer、QScopedPointer、QWeakPointer、QSharedDataPointer、QExplicitlySharedDataPointer、 QGuard、QtPatternist::AutoPtr 由于Qt智能指针较多,避免篇幅较长本⽂只对平时使⽤场景较多的QSharedPointer源码进⾏分析也⽐较有代表性 QSharedPointer 官⽅介绍: QSharedPointer类持有对共享指针的强引⽤。QSharedPointer是c++中的⼀个⾃动共享指针。它的⾏为与⽤于普通⽬的的普通指针完全 相同,包括对constness的尊重。当指针超出作⽤域时,QSharedPointer将删除它所持有的指针,前提是没有其他QSharedPointer对象 引⽤它。QSharedPointer对象可以从普通指针、另⼀个QSharedPointer对象或通过将QWeakPointer对象提升为强引⽤来创建。 本⽂基于Qt5.12.4版本分析 QSharedPointer类模板 类模板(smart指针指针类)源码分析 源码分析 QSharedPointer类源码篇幅较长,避免出现阅读疲劳以下分段解读。 1. QSharedPointer类模板对于模板参数 类模板对于模板参数T的类型重定义 的类型重定义 template class QSharedPointer { typedef T *QSharedPointer:: *RestrictedBool; typedef QtSharedPointer::ExternalRefCountData Data; public: typedef T Type; typedef T element_type; typedef T value_type; typedef value_type *pointer; typedef const value_type *const_pointer; typedef value_type &reference; typedef const value_type &const_reference; typedef qptrdiff difference_type; }; QSharedPointer提供了部分公有和私有的对于模板参数T的类型重定义(说明: 这⾥T类型并不是指⼀个特定类型,⽽是⼀个通⽤/万能类 型。 我们可以把类模板看做成⼀个函数 QSharedPointer为函数名, template中类型列表的为函数形参列表,typedef 为返回值。 T最终 的类型确认待你使⽤时由编译器实例化模板时才能推导出),QSharedPointer类模板分别重定义了模板⼊参T的类型别名、指针、常指针、 引⽤、常引⽤类型。这也是模板的惯⽤⼿法和伎俩⽅便对于类型的获取和使⽤ 原因有以下⼏点: a. 提供公有的对于T的类型重定义⽅便的类外部获取和使⽤T及其衍⽣类型。 b. 类内部实现过程中统⼀,规范对于T的使⽤。 2. QSharedPointer的成员属性 的成员属性 template class QSharedPointer { // @1 Type *value; // @2 Data *d; }; QSharedPointer成员属性⽐较简洁代码段@1声明成员属性value(需要管理的裸指针), 代码段@2声明属性d。Data类型我们从第1点中可 知为QtSharedPointer::ExternalRefCountData 的类型别名。主要作⽤为记录当前持有value的QSharedPointer
《深入理解C++11:C++11新特性解析与应用》主要内容:国内首本全面深入解读C++11新标准的专著,由C++标准委员会代表和IBM XL编译器中国开发团队共同撰写。不仅详细阐述了C++11标准的设计原则,而且系统地讲解了C++11新标准中的所有新语言特性、新标准库特性、对原有特性的改进,以及如何应用所有这些新特性。 全书一共8章:第1章从设计思维和应用范畴两个维度对C++11新标准中的所有特性进行了分类,呈现了C++11新特性的原貌;第2章讲解了在保证与C语言和旧版C++标准充分兼容的原则下增加的一些新特性;第3章讲解了具有广泛可用性、能与其他已有的或者新增的特性结合起来使用的、具有普适性的一些新特性;第4章讲解了C++11新标准对原有一些语言特性的改进,这些特性不仅能让C++变得更强大,还能提升程序员编写代码的效率;第5章讲解了C++11在安全方面所做的改进,主要涵盖枚举类型安全和指针安全两个方面的内容;第6章讲解了为了进一步提升和挖掘C++程序性能和让C++能更好地适应各种新硬件的发展而设计的新特性,如多核、多线程、并行编程方面的新特性;第7章讲解了一些颠覆C++一贯设计思想的新特性,如lambda表达式等;第8章讲解了C++11为了解决C++编程中各种典型实际问题而做出的有效改进,如对Unicode的深入支持等。附录中则介绍了C++11标准与其他相关标准的兼容性和区别、C++11中弃用的特性、编译器对C++11的支持情况,以及学习C++11的相关资源。 《深入理解C++11:C++11新特性解析与应用》 免责声明 序 前言 第1章 新标准的诞生 1 1.1 曙光:C++11标准的诞生 1 1.1.1 C++11/C++0x(以及C11/C1x)—新标准诞生 1 1.1.2 什么是C++11/C++0x 2 1.1.3 新C++语言的设计目标 3 1.2 今时今日的C++ 5 1.2.1 C++的江湖地位 5 1.2.2 C++11语言变化的领域 5 1.3 C++11特性的分类 7 1.4 C++特性一览 11 1.4.1 稳定性与兼容性之间的抉择 11 1.4.2 更倾向于使用库而不是扩展语言来实现特性 12 1.4.3 更倾向于通用的而不是特殊的手段来实现特性 13 1.4.4 专家新手一概支持 13 1.4.5 增强类型的安全性 14 1.4.6 与硬件紧密合作 14 1.4.7 开发能够改变人们思维方式的特性 15 1.4.8 融入编程现实 16 1.5 本书的约定 17 1.5.1 关于一些术语的翻译 17 1.5.2 关于代码中的注释 17 1.5.3 关于本书中的代码示例与实验平台 18 第2章 保证稳定性和兼容性 19 2.1 保持与C99兼容 19 2.1.1 预定义宏 19 2.1.2 __func__预定义标识符 20 2.1.3 _Pragma操作符 22 2.1.4 变长参数的宏定义以及__VA_ARGS__ 22 2.1.5 宽窄字符串的连接 23 2.2 long long整型 23 2.3 扩展的整型 25 2.4 宏__cplusplus 26 2.5 静态断言 27 2.5.1 断言:运行时与预处理时 27 2.5.2 静态断言与static_assert 28 2.6 noexcept修饰符与noexcept操作符 32 2.7 快速初始化成员变量 36 2.8 非静态成员的sizeof 39 2.9 扩展的friend语法 40 2.10 final/override控制 44 2.11 模板函数的默认模板参数 48 2.12 外部模板 50 2.12.1 为什么需要外部模板 50 2.12.2 显式的实例化与外部模板的声明 52 2.13 局部和匿名类型作模板实参 54 2.14 本章小结 55 第3章 通用为本,专用为末 57 3.1 继承构造函数 57 3.2 委派构造函数 62 3.3 右值引用:移动语义和完美转发 68 3.3.1 指针成员与拷贝构造 68 3.3.2 移动语义 69 3.3.3 左值、右值与右值引用 75 3.3.4 std::move:强制转化为右值 80 3.3.5 移动语义的一些其他问题 82 3.3.6 完美转发 85 3.4 显式转换操作符 89 3.5 列表初始化 92 3.5.1 初始化列表 92 3.5.2 防止类型收窄 96 3.6 POD类型 98 3.7 非受限联合体 106 3.8 用户自定义字面量 110 3.9 内联名字空间 113 3.10 模板的别名 118 3.11 一般化的SFINEA规则 119 3.12 本章小结 121 第4章 新手易学,老兵易用 123 4.1 右尖括号>的改进 123 4.2 auto类型推导 124 4.2.1 静态类型、动态类型与类型推导 124 4.2.2 auto的优势 126 4.2.3 auto的使用细则 130 4.3 decltype 134 4.3.1 typeid与decltype 134 4.3.2 decltype的应用 136 4.3.3 decltype推导四规则 140 4.3.4 cv限制符的继承与冗余的符号 143 4.4 追踪返回类型 145 4.4.1 追踪返回类型的引入 145 4.4.2 使用追踪返回类型的函数 146 4.5 基于范围的for循环 150 4.6 本章小结 153 第5章 提高类型安全 155 5.1 强类型枚举 155 5.1.1 枚举:分门别类与数值的名字 155 5.1.2 有缺陷的枚举类型 156 5.1.3 强类型枚举以及C++11对原有枚举类型的扩展 160 5.2 堆内存管理:智能指针与垃圾回收 163 5.2.1 显式内存管理 163 5.2.2 C++11的智能指针 164 5.2.3 垃圾回收的分类 167 5.2.4 C++与垃圾回收 169 5.2.5 C++11与最小垃圾回收支持 170 5.2.6 垃圾回收的兼容性 172 5.3 本章小结 173 第6章 提高性能及操作硬件的能力 174 6.1 常量表达式 174 6.1.1 运行时常量性与编译时常量性 174 6.1.2 常量表达式函数 176 6.1.3 常量表达式值 178 6.1.4 常量表达式的其他应用 180 6.2 变长模板 183 6.2.1 变长函数和变长的模板参数 183 6.2.2 变长模板:模板参数包和函数参数包 185 6.2.3 变长模板:进阶 189 6.3 原子类型与原子操作 196 6.3.1 并行编程、多线程与C++11 196 6.3.2 原子操作与C++11原子类型 197 6.3.3 内存模型,顺序一致性与memory_order 203 6.4 线程局部存储 214 6.5 快速退出:quick_exit与at_quick_exit 216 6.6 本章小结 219 第7章 为改变思考方式而改变 220 7.1 指针空值—nullptr 220 7.1.1 指针空值:从0到NULL,再到nullptr 220 7.1.2 nullptr和nullptr_t 223 7.1.3 一些关于nullptr规则的讨论 225 7.2 默认函数的控制 227 7.2.1 类与默认函数 227 7.2.2 “= default”与“= deleted” 230 7.3 lambda函数 234 7.3.1 lambda的一些历史 234 7.3.2 C++11中的lambda函数 235 7.3.3 lambda与仿函数 238 7.3.4 lambda的基础使用 240 7.3.5 关于lambda的一些问题及有趣的实验 243 7.3.6 lambda与STL 247 7.3.7 更多的一些关于lambda的讨论 254 7.4 本章小结 256 第8章 融入实际应用 258 8.1 对齐支持 258 8.1.1 数据对齐 258 8.1.2 C++11的alignof和alignas 261 8.2 通用属性 267 8.2.1 语言扩展到通用属性 267 8.2.2 C++11的通用属性 268 8.2.3 预定义的通用属性 270 8.3 Unicode支持 274 8.3.1 字符集、编码和Unicode 274 8.3.2 C++11中的Unicode支持 276 8.3.3 关于Unicode的库支持 280 8.4 原生字符串字面量 284 8.5 本章小结 286 附录A C++11对其他标准的不兼容项目 287 附录B 弃用的特性 294 附录C 编译器支持 301

1,194

社区成员

发帖
与我相关
我的任务
社区描述
该论坛主要探讨IBM AIX平台的安装、部署、应用开发等话题,并为网友们提供自由交流的平台。
社区管理员
  • IBM AIX社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧