tipos template plantillas plantilla funciones example c++ c++11 templates gcc clang

template - tipos de plantillas en c++



Ocultación de plantillas de función miembro-¿Qué compilador es correcto? (1)

Escribí el siguiente código que oculta las plantillas de función miembro.

#include <iostream> struct A { template<int> void func() { std::cout<<"Function tamplate of A"<<std::endl; } }; struct B : A { template<char> void func() { std::cout<<"Function tamplate of B"<<std::endl; } using A::func; }; int main() { B().func<0>(); }

Este programa funciona en el compilador de Clang . Demo en vivo Clang

Pero, el compilador GCC da un error de ambigüedad. Demostración en vivo GCC

source_file.cpp: In function ‘int main()’: source_file.cpp:22:17: error: call of overloaded ‘func()’ is ambiguous B().func<0>();

Entonces, ¿qué compilador es correcto?


Con respecto al ejemplo en el OP: como me indicó W.F. , lo que importa aquí es que esas son plantillas de función miembro . Agregó una declaración de uso, que especifica ( [namespace.udecl]/15 ):

Cuando una declaración de uso trae nombres de una clase base a un ámbito de clase derivado, las funciones miembro y las plantillas de función miembro en la clase derivada anulan y / o ocultan las funciones miembro y las plantillas de función miembro con el mismo nombre, lista de tipos de parámetros, cv -cualificación y ref-calificador (si existe) en una clase base (en lugar de conflictiva).

Observe cómo los parámetros de la plantilla no se tienen en cuenta. Y es Clang el que trató el código correctamente ocultando la versión int .

Por otro lado, si uno examina el ejemplo tobi303 sugerido en su publicación , GCC está un poco a la derecha. Esto simplemente no está especificado para ser resuelto de alguna manera.

Para uno, hay [temp.fct.spec]/3 :

Los argumentos finales de la plantilla que se pueden deducir u obtener a partir de los argumentos predeterminados de la plantilla se pueden omitir de la lista de los argumentos explícitos de la plantilla. [...] En contextos donde la deducción se realiza y falla, o en contextos donde la deducción no se realiza, si se especifica una lista de argumentos de plantilla y, junto con cualquier argumento de plantilla predeterminado, identifica una especialidad de plantilla de función única, entonces la plantilla -id es un lvalor para la especialización de la plantilla de función .

El texto en negrita indica que su programa está bien formado solo si el argumento de la plantilla que proporcionamos designa una única especialización. Y aparentemente, no lo hace, ya que de acuerdo con [temp.arg.nontype]/1 :

Un argumento de plantilla para un parámetro de plantilla que no sea de tipo ni de plantilla será uno de los siguientes:

  • para un parámetro de plantilla no tipo de tipo integral o de enumeración, una expresión constante convertida del tipo de parámetro de plantilla;

Y 0 encaja ambas sobrecargas como una expresión constante convertida. Debido a que no hay ninguna clasificación ICS para los argumentos de la plantilla, esto es ambiguo.