我“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;
}
正如您所看到的,我无法使用函数调用,因为它不能作为默认参数,对吧?有解决方案吗?
答案 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。