我有一个模板基类,期望子类将自己作为模板参数传递。
它看起来有点像这样:
这段话的意思是:“编译和运行都符合预期。但现在我想让Derived :: LIFE成为constexpr。这可能吗?我不能只将其const限定符更改为constexpr,因为constexpr需要在声明时初始化。”
我无法在那里初始化它,因为Derived是不完整的类型:
我意识到,如果Derived是一个完整的类型,这个问题就会消失,但在这种情况下,出于与本问题无关的原因,我对自引用模板基类非常依赖。
它看起来有点像这样:
template<typename T>
struct Base {
constexpr Base(int x) : m_x(x) {}
private:
int m_x;
};
struct Derived : public Base<Derived>
{
static const Derived LIFE;
constexpr Derived(int x) : Base(x) {}
};
const Derived Derived::LIFE = Derived(42);
这段话的意思是:“编译和运行都符合预期。但现在我想让Derived :: LIFE成为constexpr。这可能吗?我不能只将其const限定符更改为constexpr,因为constexpr需要在声明时初始化。”
test.cpp:10:28: error: constexpr static data member ‘LIFE’ must have an initializer
static constexpr Derived LIFE;
我无法在那里初始化它,因为Derived是不完整的类型:
test.cpp:10:45: error: invalid use of incomplete type ‘struct Derived’
static constexpr Derived LIFE = Derived(42);
我意识到,如果Derived是一个完整的类型,这个问题就会消失,但在这种情况下,出于与本问题无关的原因,我对自引用模板基类非常依赖。
如果我正确理解this answer中的最后一段,似乎至少有一些讨论将来如何处理不完整类型,但这并不能帮助我解决眼前的问题。
是否有人知道一些技巧可以推迟我的上述代码中LIFE的初始化?
Derived
是在其“作用域”内的不完整类型(名称查找被推迟到类定义之后),因此您可能无法创建其类型的constexpr
对象作为静态数据成员。但是,类的成员函数的定义不在其作用域内。因此,您应该能够使用类似于static constexpr Derived get_LIFE() { return {42}; }
的东西。 - dyp