关于sizeof 的问题

FMD 2001-06-25 11:18:00
在一个使用了模板的基类中针对数组成员调用sizeof,无法通过
如何解决?

template <class T>
class CMarcoValueToString
{
public:
LPCTSTR GetMacroString(T value);
typedef struct valueandstring
{
T value;
LPCTSTR name;
}SValueAndString;
protected:
static SValueAndString m_marcos[]; //静态数组,派生类中将初始化并填充
//派生类是这样定义的:class CInternetStatusMacro:public CMarcoValueToString<DWORD>
};

template <class T>
LPCTSTR CMarcoValueToString<T>::GetMacroString(T value)
{

int size=sizeof(m_marcos);/sizeof(SValueAndString) ; //第一个sizeof无法编译通过
//error C2070: illegal sizeof operand
for(int i=0;i<size;i++)
{
if(value==m_marcos[i].value)
return m_marcos[i].name;
}
return NULL;
}

在派生类中,模板类型T被指定为DWORD ,按理SValueAndString的大小已经确定了,为何无法使用Sizeof
望指点。
...全文
191 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
FMD 2001-06-26
  • 打赏
  • 举报
回复
真相大白

多谢 的耐心指教

sizeof 没有问题
是我初始化代码放错了地方

由于派生类中,不再有类模板参数,我就"想当然"的将其实现放到了cpp文件中。
静态数组的初始化也放到了cpp文件中。

现将派生类中数组初始化移到头文件中,编译正常了。

看来,只要基类中涉及到了模板,后继类都得写到头文件中去。
plato 2001-06-26
  • 打赏
  • 举报
回复
sizeof(m_macros)也没有问题
FMD 2001-06-26
  • 打赏
  • 举报
回复
第一个sizeof
sizeof(m_marcos);
针对数组的

第二个sizeof针对结构体的,没有问题
plato 2001-06-26
  • 打赏
  • 举报
回复
可以啊,sizeof(SValueAndString)编译通过。
FMD 2001-06-26
  • 打赏
  • 举报
回复
模板类中使用sizeof需要注意哪些问题
FMD 2001-06-25
  • 打赏
  • 举报
回复
初始化的代码当然有,是在派生类的CPP中
//类似于MFC的消息映填表过程

#define BEGIN_MACRO_MAP(type) CMarcoValueToString<type>::SValueAndString CMarcoValueToString<type>::m_marcos[]={
#define MACRO_MAP(x) x,#x,
#define END_MACRO_MAP };


BEGIN_MACRO_MAP(DWORD)
MACRO_MAP(INTERNET_STATUS_REQUEST_COMPLETE )
...
END_MACRO_MAP

研究了MFC 关于消息映射的源码,发现MS也回避了这个问题
他在数组最后填充了一个特殊项,根据特殊项来判断数组的大小。
我已经决定采用这种方法了。

但我还想听听各位对这个语法问题的探讨
过两天,在将分数分给大家. 谢谢了

xlqin 2001-06-25
  • 打赏
  • 举报
回复
其实我也昏倒了!

建议使用plato(天天)的第二格式,

#define DECLARE_MESSAGE_MAP() private: static const AFX_MSGMAP_ENTRY _messageEntries[]; \ \\\这就不是吗???
protected: static AFX_DATA const AFX_MSGMAP messageMap; virtual const AFX_MSGMAP* GetMessageMap() const; ...

这是宏定义,应有另处的宏来初始化 static XX_class YY[] 中的YY!!!
FMD 2001-06-25
  • 打赏
  • 举报
回复
怎么不行(昏倒谁了?)

你看一下MFC源码:

#define DECLARE_MESSAGE_MAP() private: static const AFX_MSGMAP_ENTRY _messageEntries[]; \ \\\这就不是吗???
protected: static AFX_DATA const AFX_MSGMAP messageMap; virtual const AFX_MSGMAP* GetMessageMap() const; ...


plato 2001-06-25
  • 打赏
  • 举报
回复
要么
template <class T,int macro_count>
class CMarcoValueToString
{
public:
LPCTSTR GetMacroString(T value);
typedef struct valueandstring
{
T value;
LPCTSTR name;
}SValueAndString;
protected:
static SValueAndString m_marcos[macro_count];
};

plato 2001-06-25
  • 打赏
  • 举报
回复
昏倒:
static SValueAndString m_marcos[];
C++中有这样定义的吗?

要么static SValueAndString *m_marcos;

要么static SValueAndString m_macros[1000];

FMD 2001-06-25
  • 打赏
  • 举报
回复
模板类中使用sizeof需要注意哪些问题
FMD 2001-06-25
  • 打赏
  • 举报
回复
int size=sizeof(m_marcos);/sizeof(SValueAndString) ;
------------------------^^^-----------------
这个分号忘了删除 ,为了调试方便,将后半部分注释掉了,贴上来时,注释"//"删了

出问题的是第一个sizeof
加上CMacroValueToString<T>::也没有用
plato 2001-06-25
  • 打赏
  • 举报
回复
sizeof(CMacroValueToString<T>::SValueAndString)
FMD 2001-06-25
  • 打赏
  • 举报
回复
我的宏定义中实际上就初始化了数组的大小
相当于
...m_marcos[]=
{
, , , , //编译器会自己确定实际的大小,不用显式的书写大小:m_marcos[?]=
}
这些,都不是这个问题的重点。我都已经通过了。

●关键是:
●数组每项中涉及到了模板类型T ,这时,还能不能使用sizeof得到模板实例化后数组实际的尺寸。
●如果能,应该怎样书写,为什么我那样写,编译会通不过。


>建议采用加一个参数template <class T,int macro_count>,
>用参数指定xxx数组大小。
一开始,我也想这样做的,但C++语法有能力在初始化时,根据填充项的数目确定数目确定数组尺寸,何不直接用之。
在需要用到尺寸时,再用sizeof取得。
这种方法在编写普通类时用过多次,但现在换到模板类中,sizeof不能通过了。
plato 2001-06-25
  • 打赏
  • 举报
回复
看了一下,在class里面可以声明static XXX xxx[];
但是这个东东必须初始化:XXX CLS::xxx[100]。

大小必须是编译时刻确定,否则编译器无法在全局数据段中分配。

建议采用加一个参数template <class T,int macro_count>,
用参数指定xxx数组大小。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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