关于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
望指点。
...全文
237 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数组大小。
内容概要:本文围绕有限控制集模型预测控制(FCS-MPC)下并网逆变器的运行特性与并网性能展开深入研究,重点基于三相LCL型并网逆变器拓扑结构,通过Simulink仿真实现对其在动态与稳态工况下的控制策略建模与性能分析。研究系统构建了包含dq轴电流内环、同步锁相环(PLL)、数字控制延时及滤波环节的分层控制小信号模型,并深入探讨了PLL引起的频率耦合效应对系统稳定性的影响,进而建立了考虑正负序分量交互的逆变器序阻抗解析模型。结合Nyquist与Bode图频域稳定判据,提出基于阻抗比的稳定性分析方法,并通过仿真扫频辨识技术提取序阻抗,验证理论模型的准确性。文章进一步剖析了弱电网条件下并网系统的耦合失稳机理,对比分析了虚拟同步发电机(VSG)、双闭环控制、模型预测控制等多种先进控制策略的性能差异,旨在提升并网电能质量、动态响应能力与抗扰性。; 适合人群:具备扎实的电力电子、自动控制理论基础,从事新能源并网、微电网、电力系统稳定性分析等相关领域的科研人员及工程技术人员,尤其适合研究生及以上学历或具有1-3年相关工作经验的研发人员。; 使用场景及目标:① 掌握FCS-MPC在并网逆变器中的控制策略设计与Simulink仿真建模方法;② 深入理解基于小信号建模的正负序阻抗建模理论及其在弱电网交互稳定性分析中的应用;③ 学习并实践利用扫频辨识法提取序阻抗及通过Nyquist/Bode判据进行频域稳定性分析的完整流程;④ 为光伏、风电等新能源发电系统的并网控制器设计、优化及振荡问题抑制提供理论依据和技术参考。; 阅读建议:建议读者结合文中提供的Matlab/Simulink仿真模型与代码进行同步实践操作,重点关注控制策略的实现细节、小信号建模的推导过程以及仿真结果与理论分析的对比验证,同时可延伸学习文档中涉及的VSG、谐波线性化、阻抗建模等关键技术,以构建系统化的新能源并网系统分析与设计能力。

16,550

社区成员

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

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

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