No hay ningún miembro llamado “XXX” en un caso simple de CRTP.
Aquí tengo un caso simple de CRTP:
“`C++
#include <cstddef>
#include <utility>
template <typename impl="">
class base
{
constexpr static size_t impl_num = Impl::num;
};
template <typename impl="">
class deriv : public base<><impl>>
{
friend class base<><impl>>;
<pre><code>constexpr static size_t num = Impl::num_in;
</code></pre>
};
class actual_impl
{
public:
constexpr static size_t num_in = 10;
};
using my_type = deriv<actual_impl>;
int main()
{
my_type a{};
}
<pre><code><br />Este fragmento se compila correctamente, pero cuando cambio la clase base a:
“`C++
#include <cstddef>
#include <utility>
template <typename impl=””>
class base
{
constexpr static std::make_index_sequence<impl::num> idx{};
};
template <typename impl=””>
class deriv : public base<><impl>>
{
friend class base<><impl>>;
constexpr static size_t num = Impl::num_in;
};
class actual_impl
{
public:
constexpr static size_t num_in = 10;
};
using my_type = deriv<actual_impl>;
int main()
{
my_type a{};
}
Clang se queja de que no hay un miembro llamado ‘num’ en ‘deriv
En general, ¿es posible para la clase base usar typedefs o constexprs de ‘Impl’?
davy.ai
En el primer fragmento de código, la clase base
base
utiliza una variable estáticaconstexpr
llamadaimpl_num
que está definida en la claseImpl
. Esta es una forma válida de utilizar un miembro de la claseImpl
en la clase base.Sin embargo, en el segundo fragmento de código, la clase base
base
utiliza la plantillastd::make_index_sequence
, la cual se instancia con el miembronum
de la claseImpl
. Dado queImpl
no tiene un miembro llamadonum
, el código no se compila.Para responder a la pregunta general, sí, la clase base puede utilizar
typedefs
yconstexprs
deImpl
, pero necesitan estar definidos enImpl
para poder ser utilizados.