Mam dwa (lub więcej) szablonów, z których każdy może dostosować określony zestaw klas, zidentyfikowany przez koncepcję. Aby oba szablony miały taką samą nazwę, muszą należeć do specjalizacji.Koncepcje C++ i specjalizacja szablonów; jak uzyskać przyjazny dla użytkownika błąd kompilatora
template< typename T >
struct pin_in { static_assert(always_false<T>::value, . . .); };
template< is_pin_in T >
struct pin_in<T> . . .
template< is_pin_in_out T >
struct pin_in<T> . . .
Działa to poprawnie, gdy jedna z specjalizacji jest zgodna. Jeśli żadna nie pasuje do szablonu podstawowego, zostanie wybrana awaria asercji. Mechanizm działa. Kocham pojęcia!
Ale komunikat o błędzie, który otrzymuję (GCC 7.2.0) wskazuje na potwierdzenie. Czy mogę w jakiś sposób uniemożliwić wybór szablonu podstawowego, więc otrzymam komunikat o błędzie informujący, że żaden szablon nie pasuje do klasy argumentów?
Dlaczego nie możesz dodać komunikatu (drugi argument) do statycznego dowodu tożsamości? –
Oczywiście, że mam, to jest. . . Ale główny komunikat o błędzie nadal wskazuje na potwierdzenie, a nie na linię, która go spowodowała. –
Kompilator czasami dodaje ślad wsteczny w postaci _in tworzenia instancji Object_ i _required from here_, gdzie wskazuje, gdzie miały miejsce instancje. –