如何使以下代码编译?
template <typename C, size_t N>
constexpr uint64_t cs_hash(const C s[N])
{
return N;
}
constexpr char sample[] = "communism";
constexpr uint64_t h = cs_hash(sample);
MSVC 2017的编译器错误是
error C2784: 'uint64_t cs_hash(const C [N])': could not deduce template argument for 'const C [N]' from 'const char [10]'
使用const
参考!
template <typename C, size_t N>
constexpr uint64_t cs_hash(const C (&s)[N])
{
return N;
}
说明
当您尝试创建类型为T []
或的函数参数时T [N]
,编译器会自动将类型替换为T *
。
这意味着您的函数声明与
template <typename C, size_t N>
constexpr uint64_t cs_hash(const C *s)
{
return N;
}
由于参数类型不依赖N
,因此N
无法推断。
但是,当您使用“对数组的引用”参数时,数组参数的上述规则将不适用,并且没有任何因素可以阻止推论正常工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句