关于sizeof 的问题 sizeof(CMacroValueToString<T>::SValueAndString) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 int size=sizeof(m_marcos);/sizeof(SValueAndString) ; ------------------------^^^-----------------这个分号忘了删除 ,为了调试方便,将后半部分注释掉了,贴上来时,注释"//"删了出问题的是第一个sizeof加上CMacroValueToString<T>::也没有用 模板类中使用sizeof需要注意哪些问题 昏倒: static SValueAndString m_marcos[];C++中有这样定义的吗?要么static SValueAndString *m_marcos;要么static SValueAndString m_macros[1000]; 要么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];}; 怎么不行(昏倒谁了?)你看一下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(天天)的第二格式,#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!!! 初始化的代码当然有,是在派生类的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也回避了这个问题他在数组最后填充了一个特殊项,根据特殊项来判断数组的大小。我已经决定采用这种方法了。但我还想听听各位对这个语法问题的探讨过两天,在将分数分给大家. 谢谢了 看了一下,在class里面可以声明static XXX xxx[];但是这个东东必须初始化:XXX CLS::xxx[100]。大小必须是编译时刻确定,否则编译器无法在全局数据段中分配。建议采用加一个参数template <class T,int macro_count>,用参数指定xxx数组大小。 我的宏定义中实际上就初始化了数组的大小相当于...m_marcos[]={ , , , , //编译器会自己确定实际的大小,不用显式的书写大小:m_marcos[?]=}这些,都不是这个问题的重点。我都已经通过了。●关键是:●数组每项中涉及到了模板类型T ,这时,还能不能使用sizeof得到模板实例化后数组实际的尺寸。●如果能,应该怎样书写,为什么我那样写,编译会通不过。>建议采用加一个参数template <class T,int macro_count>,>用参数指定xxx数组大小。 一开始,我也想这样做的,但C++语法有能力在初始化时,根据填充项的数目确定数目确定数组尺寸,何不直接用之。在需要用到尺寸时,再用sizeof取得。这种方法在编写普通类时用过多次,但现在换到模板类中,sizeof不能通过了。 模板类中使用sizeof需要注意哪些问题 可以啊,sizeof(SValueAndString)编译通过。 第一个sizeofsizeof(m_marcos);针对数组的第二个sizeof针对结构体的,没有问题 真相大白多谢 的耐心指教sizeof 没有问题是我初始化代码放错了地方由于派生类中,不再有类模板参数,我就"想当然"的将其实现放到了cpp文件中。静态数组的初始化也放到了cpp文件中。现将派生类中数组初始化移到头文件中,编译正常了。看来,只要基类中涉及到了模板,后继类都得写到头文件中去。 最接近标准C的编译器是? 帮朋友问一个问题. 求救!!! ALT编写OCX控件问题! [求助]关于定位文本文件中的某行的问题!!! 关于MsFlexGrid在vc++ 2005 下的用法。 DC问题求教! 如何实现一个类似IE地址栏有历史记录功能的编辑框 为什么创建套接字报错?sListen=socket(AF_INET,SOCK_STREAM,IPPROTO_IP); 运行速度的问题如何解决? 谁能给我提供点关于shell编程的文章 和好的书籍啊!!! ******好奇怪?我的工程被撑破了?******
------------------------^^^-----------------
这个分号忘了删除 ,为了调试方便,将后半部分注释掉了,贴上来时,注释"//"删了出问题的是第一个sizeof
加上CMacroValueToString<T>::也没有用
static SValueAndString m_marcos[];
C++中有这样定义的吗?要么static SValueAndString *m_marcos;要么static SValueAndString m_macros[1000];
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];
};
protected: static AFX_DATA const AFX_MSGMAP messageMap; virtual const AFX_MSGMAP* GetMessageMap() const; ...
protected: static AFX_DATA const AFX_MSGMAP messageMap; virtual const AFX_MSGMAP* GetMessageMap() const; ...这是宏定义,应有另处的宏来初始化 static XX_class YY[] 中的YY!!!
//类似于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也回避了这个问题
他在数组最后填充了一个特殊项,根据特殊项来判断数组的大小。
我已经决定采用这种方法了。但我还想听听各位对这个语法问题的探讨
过两天,在将分数分给大家. 谢谢了
但是这个东东必须初始化:XXX CLS::xxx[100]。大小必须是编译时刻确定,否则编译器无法在全局数据段中分配。建议采用加一个参数template <class T,int macro_count>,
用参数指定xxx数组大小。
相当于
...m_marcos[]=
{
, , , , //编译器会自己确定实际的大小,不用显式的书写大小:m_marcos[?]=
}
这些,都不是这个问题的重点。我都已经通过了。●关键是:
●数组每项中涉及到了模板类型T ,这时,还能不能使用sizeof得到模板实例化后数组实际的尺寸。
●如果能,应该怎样书写,为什么我那样写,编译会通不过。
>建议采用加一个参数template <class T,int macro_count>,
>用参数指定xxx数组大小。
一开始,我也想这样做的,但C++语法有能力在初始化时,根据填充项的数目确定数目确定数组尺寸,何不直接用之。
在需要用到尺寸时,再用sizeof取得。
这种方法在编写普通类时用过多次,但现在换到模板类中,sizeof不能通过了。
sizeof(m_marcos);
针对数组的第二个sizeof针对结构体的,没有问题
是我初始化代码放错了地方由于派生类中,不再有类模板参数,我就"想当然"的将其实现放到了cpp文件中。
静态数组的初始化也放到了cpp文件中。现将派生类中数组初始化移到头文件中,编译正常了。看来,只要基类中涉及到了模板,后继类都得写到头文件中去。