gpt4 book ai didi

c++ - 模板的 typedef 包括 char[][] - 适用于 VS2008 但不适用于 gcc

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:16:06 26 4
gpt4 key购买 nike

我有一些正在使用的库代码。它在 Visual Studio (2008) 下编译和工作,但不是 GCC (v4.8.4.)

在标题中我们有:

extern const char menu_styles[MENU_COUNT][MAX_LEN];

typedef SysEnum <s_type_t, c_long, no_style, un_style, MAX_LEN, (char *)&menu_styles> MenuStyleEnum;

SysEnum 在哪里(在另一个文件中定义):

template<class ETYPE, class BTYPE, int MINV, int MAXV, int MLEN, char* pStr> class SysEnum

gcc 遇到错误:

error: ‘menu_styles’ cannot appear in a constant-expression

我完全同意。 (此外,它是 const char * 转换为 char *)。

我希望 VS2008 只是用 const char * 而不是 menu_styles 编译这个 typedef,但我真的不确定。

我担心 VisualSudio 正在添加某种类似于构造函数的代码,因此无论何时使用此 typedef,此 char * 确实指向 menu_styles

用 GCC 编译时,我可以用什么交换它?

最佳答案

你的问题归结为编译

extern const char menu_styles[MENU_COUNT][MAX_LEN];

template<const char* pStr> class SysEnum{
...
};

typedef SysEnum <???> MenuStyleEnum;

我将模板参数更改为 const char* ,因为否则你必须放弃常量,这不是一件好事。基本上问题是什么 ???应该是。

定义 char* 的最常用方法模板参数是有一个char[]某个地方的变量,它会衰减到 char*让每个人都开心:

extern const char menu_style0[MAX_LEN];
typedef SysEnum <menu_style0> MenuStyleEnum;//compiles...

但是,正如评论中已经指出的那样,该标准不允许我们执行以下任何操作:

typedef SysEnum <menu_styles[0]> MenuStyleEnum;
typedef SysEnum <*menu_styles> MenuStyleEnum;
typedef SysEnum <static_cast<const char *>(&menu_styles)> MenuStyleEnum;

我不确定技术限制是导致此行为的原因,毕竟可以找出 menu_styles[0] 的地址在编译期间(VS 正是这样做的)。我的猜测是它无法编译,因为标准是这么说的。

这不会让你在这里有很多选择。如果SysEnum仅使用 pStr 的值指向(类似 cout<<pStr 的代码)并且地址本身并不重要(对于类似 pStr==otherCharPointer 的代码就是这种情况),那么可能有以下解决方法:

#define _MENU_STYLE0_ "STYLE0" 
...

extern const char menu_style0[MAX_LEN]= _MENU_STYLE0_;
...

extern const char menu_styles[MENU_COUNT][MAX_LEN]={ _MENU_STYLE0_, _MENU_STYLE1_, ...};
...

typedef SysEnum <menu_style0> MenuStyleEnum;//compiles!

缺点是,相同的信息存在于 menu_styleX 中和 menu_styles ,感觉这不是一个很好的解决方案。

如果只有来自 menu_styles 的值可以是模板参数,它可以更容易声明:

template<size_t Index> class SysEnum{
//use menu_styles[index] for pStr
};

typedef SysEnum <0> MenuStyleEnum;

但是,您将失去使用存储在 menu_styles 中的值的可能性。和一些重构 SysEnum需要。

关于c++ - 模板的 typedef 包括 char[][] - 适用于 VS2008 但不适用于 gcc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34938204/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com