Spezialisierung von std::numeric_limits<>



  • Hallo,

    ich möchte das Template std::numeric_limits<> für einen neuen Datentyp spezialisieren. Der Datentyp stammt von einem automatischen Differenzierer (CppAD) und heißt AD<double>. Er verhält sich im Wesentlichen wie double. Daher habe ich folgende Spezialisierung erzeugt:

    #include <limits>
    namespace std {
    template<>
    struct numeric_limits< AD<double> >
    {
      static const bool is_specialized = true;
    
      static AD<double> max() throw() 	{
        return AD<double>(numeric_limits<double>::max());
      }
    
      static AD<double> min() throw() 	{
        return AD<double>(numeric_limits<double>::min());
      }
    
      ... // andere members von numeric_limits
    };
    }// namespace std
    

    Praktisch alle Member des spezialisierten Templates funktionieren korrekt. So gibt etwa numeric_limits<AD<double> >::min() den gleichen Wert zurück wie für double.

    Das Problem: Der Aufruf numeric_limits<AD<double> >::max() liefert immer 0. Ein Test hat gezeigt, dass hier die Methode des unspezialisierten Templates aufgerufen wird, meine neue Methode wird dagegen nicht aufgerufen. Warum wird meine Spezialisierung hier nicht erkannt oder nicht verwendet?

    Vielen Dank und viele Grüße,
    Peter



  • OK, das war ein dummer Fehler. Ich hatte in einer anderen .cpp Datei bereits #include <limits> aufgerufen und dort nur die Funktion std::numeric_limits<AD<double> >::max() verwendet. Dadurch wurde diese offensichtlich bereits aus dem Standard-Template instanziiert und später nicht mehr durch meine Spezialisierung ersetzt. Durch das Einbinden meiner Spezialisierung an dieser Stelle wurde der Fehler behoben.


Anmelden zum Antworten