sizeof(CMacroValueToString<T>::SValueAndString)

解决方案 »

  1.   

    int size=sizeof(m_marcos);/sizeof(SValueAndString) ;  
    ------------------------^^^-----------------
    这个分号忘了删除 ,为了调试方便,将后半部分注释掉了,贴上来时,注释"//"删了出问题的是第一个sizeof
    加上CMacroValueToString<T>::也没有用
      

  2.   

    模板类中使用sizeof需要注意哪些问题
      

  3.   

    昏倒:
        static SValueAndString m_marcos[];
    C++中有这样定义的吗?要么static SValueAndString *m_marcos;要么static SValueAndString m_macros[1000];
      

  4.   

    要么
    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];
    };
      

  5.   

    怎么不行(昏倒谁了?)你看一下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; ...
      

  6.   

    其实我也昏倒了!建议使用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!!!
      

  7.   

    初始化的代码当然有,是在派生类的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也回避了这个问题
    他在数组最后填充了一个特殊项,根据特殊项来判断数组的大小。
    我已经决定采用这种方法了。但我还想听听各位对这个语法问题的探讨
    过两天,在将分数分给大家. 谢谢了 
      

  8.   

    看了一下,在class里面可以声明static XXX xxx[];
    但是这个东东必须初始化:XXX CLS::xxx[100]。大小必须是编译时刻确定,否则编译器无法在全局数据段中分配。建议采用加一个参数template <class T,int macro_count>,
    用参数指定xxx数组大小。
      

  9.   

    我的宏定义中实际上就初始化了数组的大小
    相当于
    ...m_marcos[]=
    {
       , , , , //编译器会自己确定实际的大小,不用显式的书写大小:m_marcos[?]=
    }
    这些,都不是这个问题的重点。我都已经通过了。●关键是:
    ●数组每项中涉及到了模板类型T ,这时,还能不能使用sizeof得到模板实例化后数组实际的尺寸。
    ●如果能,应该怎样书写,为什么我那样写,编译会通不过。
    >建议采用加一个参数template <class T,int macro_count>,
    >用参数指定xxx数组大小。 
    一开始,我也想这样做的,但C++语法有能力在初始化时,根据填充项的数目确定数目确定数组尺寸,何不直接用之。
    在需要用到尺寸时,再用sizeof取得。
    这种方法在编写普通类时用过多次,但现在换到模板类中,sizeof不能通过了。
      

  10.   

    模板类中使用sizeof需要注意哪些问题
      

  11.   

    可以啊,sizeof(SValueAndString)编译通过。
      

  12.   

    第一个sizeof
    sizeof(m_marcos);
    针对数组的第二个sizeof针对结构体的,没有问题
      

  13.   

    真相大白多谢  的耐心指教sizeof 没有问题
    是我初始化代码放错了地方由于派生类中,不再有类模板参数,我就"想当然"的将其实现放到了cpp文件中。
    静态数组的初始化也放到了cpp文件中。现将派生类中数组初始化移到头文件中,编译正常了。看来,只要基类中涉及到了模板,后继类都得写到头文件中去。