【发布时间】:2017-10-22 09:00:50
【问题描述】:
我在一本用于在编译时创建 SDBM 哈希的书中找到了这个示例/类。不幸的是,它不能编译(c++11 和 c++14 都没有)。我收到error: call to non-constexpr function。我已经尝试了一点,但我似乎无法完成这项工作。所以这是我的问题:
- 为什么它不起作用,如何解决? (对不起,我知道这是一个笼统的问题,但至少对于一个非常具体的案例来说)
供您测试的完整(不工作)示例:
#include <iostream>
template <int stringLength>
struct SDBMCalculator
{
static inline int Calculate(const char* const stringToHash, int& value)
{
int character = SDBMCalculator<stringLength - 1>::Calculate(stringToHash, value);
value = character + (value << 6) + (value << 16) - value;
std::cout << static_cast<char>(character) << std::endl << value << std::endl << std::endl;
return stringToHash[stringLength - 1];
}
static inline int CalculateValue(const char* const stringToHash)
{
int value = 0;
int character = SDBMCalculator<stringLength>::Calculate(stringToHash, value);
value = character + (value << 6) + (value << 16) - value;
std::cout << static_cast<char>(character) << std::endl << value << std::endl << std::endl;
return value;
}
};
template <>
struct SDBMCalculator<1>
{
static inline int Calculate(const char* const stringToHash, int& value)
{
return stringToHash[0];
}
};
int main()
{
constexpr int eventID = SDBMCalculator<5>::CalculateValue("Hello");
std::cout << eventID << std::endl;
}
非常感谢您的时间和精力!
【问题讨论】:
-
对此我唯一能说的就是重复错误消息:您正在调用一个未标记为 constexpr 的函数。您的
Calculate和CalculateValue函数不是 constexpr。计算 constexpr 值时不能调用非 constexpr 函数。 -
你可能想要
const。该函数的值在编译时是未知的,因为您在运行时提供了一个参数。
标签: c++ c++11 hash c++14 template-meta-programming