es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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‘. Estoy confundido por qué el primer caso funciona pero no el segundo, ¿cuál es la diferencia fundamental entre estos dos casos, ya que me parece que en ambos casos se usan ‘Impl::num_in’ en la clase base?

En general, ¿es posible para la clase base usar typedefs o constexprs de ‘Impl’?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    En el primer fragmento de código, la clase base base utiliza una variable estática constexpr llamada impl_num que está definida en la clase Impl. Esta es una forma válida de utilizar un miembro de la clase Impl en la clase base.

    Sin embargo, en el segundo fragmento de código, la clase base base utiliza la plantilla std::make_index_sequence, la cual se instancia con el miembro num de la clase Impl. Dado que Impl no tiene un miembro llamado num, el código no se compila.

    Para responder a la pregunta general, sí, la clase base puede utilizar typedefs y constexprs de Impl, pero necesitan estar definidos en Impl para poder ser utilizados.

Comments are closed.