参数类型为'const C s [N]'的模板函数(类型C的元素的固定大小数组)

阿列克谢·斯塔林斯基

如何使以下代码编译?

    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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在C ++中比较chars-类型为char的参数与类型为const char *的参数不兼容

类型为“ const wchar_t”的C ++参数*与类型为“ wchar_t”的参数不兼容

预期的'const char *',但参数在C中的类型为'char **'

根据C ++模板函数的参数类型解析为不同的类型

'this'参数的类型为const但函数未标记为const

const类型的C ++模板泛化

预期的预期为'const char **',但参数的类型为'char **'

预期为“ const char * __restrict__”,但参数的类型为“ int”

接受const和非const类型的C ++模板类

在C ++中,如何将const应用于参数列表之外的模板参数类型?

从Go访问const char *类型的C数组

C typedef const参数

在 C 中声明指针类型的参数时使用 `const`

IntelliSense:类型为“ _TCHAR *”的参数与类型为“ const char *”的参数不兼容

C const 指向 const struct 数组的指针作为函数参数

C ++中Const类型的困境

C ++ Eclipse为const参数提供“无效参数”

C#是否为引用类型对象提供“正确”的const?

C ++:返回类型为T且不带T类型参数的模板函数将无法编译

参数类型为:(size_t,const char [2])

C4477:'fprintf':格式字符串'%s'需要一个类型为'char *'的参数,而可变参数1的类型为'int *'

成员函数'select'的'this'参数类型为'const SelectParam',但函数未标记为const

成员函数的'this'参数类型为'const',但是我的函数实际上不是'const'

避免警告:预期为'const struct aiocb * const *',但参数的类型为'struct aiocb **'

格式'%c'期望的参数类型为'char *',但是参数2的类型类型为'char(*)[0]'

C学生作业,'%f'期望参数类型为'float *',但是参数2的类型类型为'double *'

C++:无法在使用类型条件的模板函数中用类型为“double”的左值初始化“char*”类型的参数

警告:格式为'c'的参数类型为'int',但是参数2的类型为'char'

C - 格式指定类型 'int' 但参数类型为 'char *' [-Wformat]