仅头文件库中的静态 constexpr 成员初始化

问题描述 投票:0回答:1

我有 found questions 几乎与我的一模一样,但我有 1 个额外的要求 - 我需要一些可以用作默认参数的东西。

我正在编写一个仅包含标头的模板库,并且我有这样的代码:

#include <chrono>

template <typename T>
class Foo
{
public:
    using Duration = std::chrono::duration<float>;
    static constexpr Duration DefaultDuration{1.0f};
    Foo(Duration duration = DefaultDuration)
        : duration{duration}
    {
    }
private:
    Duration duration;
};

int main(int argc, char* argv[])
{
    Foo<int> foo;
}

如您所见,我无法使用函数调用,因为它不能作为默认参数,对吗?有解决办法吗?

c++ templates static c++14
1个回答
3
投票

这里的问题似乎不是默认参数,而是初始化。通过切换到统一初始化语法,并显式声明静态类成员,使用 gcc 6.2.1 进行编译时不会出现问题:

#include <chrono>

template <typename T>
class Foo
{
public:

    static constexpr std::chrono::duration<float> DefaultDuration{1.0f};

    Foo(std::chrono::duration<float> duration = DefaultDuration);
};

template<typename T>
constexpr std::chrono::duration<float> Foo<T>::DefaultDuration;

Foo<int> f;

int main()
{
    return 0;
}

gcc 6.2.1 实际上让您无需显式定义静态 const 成员,但这在技术上是必需的,如此处所述

© www.soinside.com 2019 - 2024. All rights reserved.