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.

¿Por qué la deducción automática de tipo no funciona para hacer referencia a miembros constexpr?

En el código de ejemplo, compilado en C++17:

template <typename t="int">
struct A
{
    static constexpr double b = 0.5;
};

int main()
{
    A a;  // compila
    double c = A<>::b; // compila
    double d = A::b; // no compila
    // ...
    return 0;
}

Ese “A::b” no compila porque:

main.cpp:13:16: error: 'template<class t=""> struct A' used without template arguments
   13 |     double d = A::b; // no compila

¿No se supone que en C++17 la deducción automática de tipos de plantilla manejaría esto automáticamente ya que se tiene el argumento de plantilla por defecto? ¿Qué me estoy perdiendo?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    En el ejemplo dado, A::b falla al compilarse porque hace referencia a un miembro estático de la plantilla struct A sin proporcionar ningún argumento de plantilla. En C ++17, la deducción automática de tipo de plantilla solo es compatible con las plantillas de función, no con las plantillas de clase. Por lo tanto, incluso si T se puede deducir del argumento predeterminado en A, aún no se puede omitir al acceder al miembro estático b utilizando el operador de resolución de ámbito::.

    Para solucionar el error, se puede proporcionar un argumento de plantilla para A al acceder a b, como se muestra en double c = A <>:: b, o utilizar un objeto de la plantilla A para acceder a b, como se muestra en A <int> :: b.

Comments are closed.