问题描述
在 C++ 中,我想将类 T
的模板参数 Foo<T>
严格限制为 Foo<T>
的继承者。为此,我写了以下内容:
template <typename TSelf> class Foo;
template <typename TSelf>
requires (is_base_of<Foo<TSelf>,TSelf>)
class Foo
{
};
我得到的错误是
'Foo': requires clause is incompatible with the declaration
我该如何解决这个问题?
解决方法
在 CRTP 中,派生类是不完整的。
您可以将该断言添加到应该作为析构函数调用的方法中:
template <typename TSelf>
class Foo
{
// ...
~Foo() { static_assert(std::is_base_of_v<Foo<TSelf>,TSelf>); }
// ...
};