鉴于这种宏取代这个宏
#define MAKE_TYPE(_a, _b, _c, _d) ((_a) | ((_b) << 8) | ((_c) << 16) | ((_d) << 24))
我想替换它以便它采用阵列[4]代替。 这样我就可以编写MAKE_TYPE(“ABCD”)而不是丑陋的MAKE_TYPE('A','B','C','D')
我在编译时使用它来生成一些一些常数。
但是,它不喜欢我传递一个字符串,这样
#define MAKE_TYPE(s) ((s[3]) | ((s[2]) << 8) | ((s[1]) << 16) | ((s[0]) << 24))
错误:一个数组引用不能出现在常数表达式
嘛,没有工作。所以我想我会采用模板metaprogramming
template< char[4] s > class MAKE_TYPE
{
public:
enum{ RESULT = s[3] | (s[2] << 8) | (s[1] << 16) | (s[0] << 24) };
};
不幸的是,这也没有奏效。我似乎无法在模板中添加char [4]。 我也得到这些错误:
错误:之前的' 误差预期“>”:“s”的在此范围 错误未声明:数组引用不能出现在恒定表达
我该怎么做?
正如其他人所说,你实际上不能这样做,但是你从模板版本中的错误信息会误导你,因为你已经写了'char [4] s',你的意思是'char s [4]'。它仍然不能解决这个问题,但是你会得到一些错误,告诉你实际的问题是什么,而不是不相关的语法错误:-)。 – 2011-04-07 10:40:44
在'char s [4]'之上,如果你想提供“ABCD”作为名字,它应该读取'char s [5]':) – xtofl 2011-04-07 10:47:37
当然是的,由于null使它成为s [5]。决定以不同的方式解决这个问题。感谢帮助的人。 – Matt 2011-04-07 10:49:10