È il meccanismo classico di SFINAE: quando la condizione booleana passata a 'std::enable_if<cond>' è falsa, la struttura non definisce il membro 'type' escludendo la funzione dal set di candidati dell'overload.
ENABLE_IF_NO_TYPE
→
Passare un template come parametro (es. 'template<template<typename> class Container>') a una classe che richiede argomenti aggiuntivi (come 'std::vector' che accetta due parametri: tipo e allocatore) fallisce a meno di usare template template variadici.
TEMPLATE_TEMPLATE_PARAM_MISMATCH
→
Il compilatore tenta di dedurre i tipi dei parametri di un template dai parametri passati alla funzione ma trova incongruenze (es. deducendo T=int e T=double contemporaneamente) o fallisce la sostituzione nei concetti/SFINAE.
TEMPLATE_DEDUCTION_FAILED
→
Una funzione dichiarata 'constexpr' viene valutata in un contesto che richiede costanti a tempo di compilazione ma contiene istruzioni non permesse (es. I/O, cast reinterpret_cast o chiamate a funzioni non-constexpr).
CONSTEXPR_NOT_CONSTANT_EXPRESSION
→
Lo standard C++ vieta la specializzazione esplicita totale di un template di funzione o classe all'interno del corpo di un'altra classe; la specializzazione deve essere spostata all'esterno nell'ambito del namespace circostante.
SPECIALIZATION_NON_NAMESPACE
→
Un algoritmo generico della libreria standard (come std::sort o std::find) tenta di applicare l'operatore '<' o '==' a un tipo T per il quale tale operatore non è stato sovraccaricato.
SFINAE_SUBSTITUTION_FAIL
→
Regola sintattica fondamentale dei template C++: quando si dichiara una variabile con un tipo annidato all'interno di un parametro template (es. 'typename T::iterator it'), il compilatore richiede 'typename' per distinguere il tipo da un membro dati.
MISSING_TYPENAME_DEPENDENT
→
Negli standard precedenti a C++20 (C++11/C++14/C++17) i parametri template non-tipo potevano essere solo interi, puntatori o riferimenti; l'uso di float o double richiedeva C++20 o l'incapsulamento in costanti statiche.
NON_TYPE_TEMPLATE_FLOAT
→