tengo el siguiente código que compila y funciona bien:C++ especialización de plantilla sin función por defecto
template<typename T>
T GetGlobal(const char *name);
template<>
int GetGlobal<int>(const char *name);
template<>
double GetGlobal<double>(const char *name);
Sin embargo Quiero eliminar la función "por defecto". Es decir, deseo realizar todas las llamadas a GetGlobal <t> donde 't' no es un error int o double double.
Por ejemplo, GetGlobal <char>() debería ser un error de tiempo de compilación.
Intenté simplemente eliminar la función predeterminada, pero, como imaginaba, recibí muchos errores ... ¿Hay alguna manera de "desactivarlo" y permitir llamadas solo a las versiones especializadas de la función?
Gracias!
Para que el primer caso de fallar en _compile real_, Koper necesitaría una función _undeclared_, no una _undefined_. Y la única forma de hacer que compile esto es hacerlo dependiente de 'T'. Algo como 'T :: some_thing_that_is_definitely_undeclared' podría hacer. (El segundo podría ser imitado con 'char dummy [! Sizeof (T)];'.) – sbi
El uso de 'unimplemented_function' da un mensaje de error más claro (al menos en Visual C++) que usando' T :: unimplemented_function'. –
@Kirill: El uso de 'unimplemented_function' no funcionará en un compilador que realice una búsqueda en dos fases. (Actualmente, VC no hace esto). Tal compilador no compilará la plantilla _definition_, aunque nunca se haya instanciado. – sbi