静态constexpr成员初始化只在标头库中

时间:2016-10-09 23:11:14

标签: c++ templates c++11 static c++14

“Public and internal-interfaces” found几乎与我的一样,但我有一个额外的要求 - 我需要一些我可以用作默认参数的东西。

我正在编写一个仅限标题的模板库,我有一个这样的代码:

#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;
}

正如您所看到的,我无法使用函数调用,因为它不能作为默认参数,对吧?有解决方案吗?

1 个答案:

答案 0 :(得分:2)

此处的问题似乎不是默认参数,而是初始化。通过切换到统一初始化语法,并显式声明静态类成员,使用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成员,但这在技术上是必需的,as explained here