我有 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;
}
如您所见,我无法使用函数调用,因为它不能作为默认参数,对吗?有解决办法吗?
这里的问题似乎不是默认参数,而是初始化。通过切换到统一初始化语法,并显式声明静态类成员,使用 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 成员,但这在技术上是必需的,如此处所述。