Digamos que tengo estos alias plantilla:¿El error de sustitución es un error con los parámetros de plantilla no de tipo dependiente?
enum class enabler {};
template <typename T>
using EnableIf = typename std::enable_if<T::value, enabler>::type;
template <typename T>
using DisableIf = typename std::enable_if<!T::value, enabler>::type;
que pueda hacer lo siguiente en GCC:
#include <iostream>
template <typename T, EnableIf<std::is_polymorphic<T>> = {}>
void f(T) { std::cout << "is polymorphic\n"; }
template <typename T, DisableIf<std::is_polymorphic<T>> = {}>
void f(T) { std::cout << "is not polymorphic\n"; }
struct foo { virtual void g() {} };
int main() {
f(foo {});
f(int {});
}
Imprime:
es polimórfico
no es polimórfico
que coincide con mis expectativas.
Con clang ese código no se compila. Produce los siguientes mensajes de error.
test.cpp:11:58: error: expected expression
template <typename T, EnableIf<std::is_polymorphic<T>> = {}>
^
test.cpp:14:59: error: expected expression
template <typename T, DisableIf<std::is_polymorphic<T>> = {}>
^
test.cpp:20:3: error: no matching function for call to 'f'
f(foo {});
^
test.cpp:12:6: note: candidate template ignored: couldn't infer template argument ''
void f(T) { std::cout << "is polymorphic\n"; }
^
test.cpp:15:6: note: candidate template ignored: couldn't infer template argument ''
void f(T) { std::cout << "is not polymorphic\n"; }
^
test.cpp:21:3: error: no matching function for call to 'f'
f(int {});
^
test.cpp:12:6: note: candidate template ignored: couldn't infer template argument ''
void f(T) { std::cout << "is polymorphic\n"; }
^
test.cpp:15:6: note: candidate template ignored: couldn't infer template argument ''
void f(T) { std::cout << "is not polymorphic\n"; }
^
4 errors generated.
¿Debe compilar? ¿Cuál de los dos compiladores está defectuoso?
Ooops, me siento tonto. Tengo la sensación de que esto no tiene nada que ver con los alias de la plantilla, por lo que el título es posiblemente engañoso: S Perdón por eso, investigaré un poco y corregiré el título si resulta que es así. –
'DisableIf> = {}' ¿esa inicialización de la lista del inicializador legal? ¿Pueden las estructuras ser parámetros de valor de plantilla? –
jpalecek
@jpalecek No, las estructuras no pueden. Es por eso que uso una enumeración :) –