C CRTP和不完整的类定义

C++ CRTP And Incomplete Class Definition

本文关键字:定义 CRTP      更新时间:2023-10-16

使用crtp时允许在基本定义中允许的派生类字段?

template<typename T>
class Base
{
public:
    constexpr int IntInDerived = T::SomeInt; // <--- Is This Valid
    using TypeInDerived = typename T::SomeType; // <--- Is This Valid
};
class Derived : public Base<Derived>
{
public:
    constexpr int SomeInt = 10;
    using SomeType = float;
};

我不确定,因为即使t :: someinint and t ::某种程度上是依赖的名称,但在矩基上实例化的派生也被认为是不完整的类型。

显然,当在问题中,将它们放置在类定义块中时,这些都是无效的。但是,由于方法将在以后单独实例化,因此在方法中访问T的成员是有效的。