请参阅以下课程
class wdt
{
public:
inline static constexpr uint32_t wdtGetTimeoutValue( uint32_t xTimeInNs )
{
return (wdt_get_timeout_value((xTimeInNs*1000),BOARD_FREQ_SLCK_XTAL));
}
private:
static constexpr const uint32_t mMsWdtTimeout = wdtGetTimeoutValue(mMsTaskInterval);
}
这是wdt_get_timeout_value()
,将被调用。
uint32_t wdt_get_timeout_value(uint32_t ul_us, uint32_t ul_sclk)
{
uint32_t max, min;
min = WDT_SLCK_DIV * 1000000 / ul_sclk;
max = min * WDT_MAX_VALUE;
if ((ul_us < min) || (ul_us > max)) {
return WDT_INVALID_ARGUMENT;
}
return WDT_MR_WDV(ul_us / min);
}
我收到了以下错误:
error: 'static constexpr uint32_t Platform::Watchdog::wdtGetTimeoutValue(uint32_t)' called in a constant expression before its definition is complete
static constexpr const uint32_t mMsWdtTimeout = wdtGetTimeoutValue(mMsTaskInterval);
如何修复错误? THX!
答案 0 :(得分:1)
1)不,在类定义完成之前,您不能使用constexpr的成员函数。
2)如果从constexpr成员函数调用方法,则被调用函数也必须是constexpr。在您的情况下,wdt_get_timeout_value
也必须是constexpr。
也许您可以定义一个基类,其中包含将使用constexpr从派生类调用的方法。
参见示例:
constexpr int ext( int i)
{
return i+2;
}
class Base
{
protected:
static constexpr int f( int i) { return ext(i)*2; }
};
class A: public Base
{
public:
static constexpr int val = 9;
static constexpr int var = f( val );
};
int main()
{
std::cout << A::var << std::endl;
}