/ / espera de expresión primaria antes del token ')' (requiere desambigador de "plantilla") [duplicado] - c ++, plantillas

expresión primaria esperada antes del token ')' (requiere desambiguador de "plantilla") [duplicado] - c ++, plantillas

Tengo un código similar al siguiente (otros detalles omitidos por brevedad):

template <uint First, uint Second, typename T>
struct Thing {
std::shared_ptr<T> asdf;
uint get() const { this->asdf->get_value<First,Second>(); }
};

... produciendo el siguiente error en GCC 7:

error: expected primary-expression before ")" token
uint get() const { this->asdf->get_value<First,Second>(); }
^

Clang 4.0.1 no informa advertencias con -Weverything (excepto cosas muy pedantes como advertencias de compatibilidad de c ++ 98); Lo mismo con GCC 7 y -W{all,extra,effc++,pedantic}.


Anteriormente no estaba al tanto de esta pregunta; mientras que la respuesta a mi problema es ciertamentedescrito aquí, el mensaje de error no dejaba claro que ese era el problema. Suponiendo que elimine esta pregunta y su respuesta asociada, otras personas que buscan este mensaje de error solo encontrarán las preguntas que encontré, es decir, las que indican El problema fue causado al pasar un tipo como argumento de función en lugar de pasar un valor.

Respuestas

3 para la respuesta № 1

TLDR: la solución fue utilizar el template palabra clave como desambigador (en la parte inferior de la página) al llamar get_value<A,B>():

uint get() const { auto tmp = this->asdf->template get_value<First,Second>(); return tmp; }
^^^^^^^^^

Las otras respuestas que encontré relacionadas con este error fueron el resultado de que el código pasó un tipo en lugar de un valor como argumento de la función.

En este caso, la función no toma argumentos. Lo que hizo obvio el problema fue cambiar la forma del código, produciendo mejores errores:

template <uint First, uint Second, typename T>
struct Thing {
std::shared_ptr<T> asdf;
uint get() const { auto tmp = this->asdf->get_value<First,Second>(); return tmp; }

... que cambió los errores a:

error: declaration of "Second" shadows template parameter
uint get() const { auto tmp = this->asdf->get_value<First,Second>(); return tmp; }

error: declaration of "Second" with type "auto" requires an initializer
uint get() const { auto tmp = this->asdf->get_value<First,Second>(); return tmp; }
^
error: expected ";" at end of declaration    };
uint get() const { auto tmp = this->asdf->get_value<First,Second>(); return tmp; }
^