double als konstanter Template-parameter



  • template <typename T, T top> class X{}
    

    funktioniert nicht, da:

    X<double, 1.0> x;
    

    double’ is not a valid type for a template constant parameter

    C++ - standard:
    A non-type template-parameter shall not be declared to have floating
    point, class, or void type. [Example:
    template<double d> class X; // error
    template<double* pd> class Y; // OK
    template<double& rd> class Z; // OK
    —end example]

    Kann mann daraus etwas basteln so dass es trotzdem mit dopuble geht?

    template <typename T, T* top> class X{}
    
    double* d = new double(1.0);
    X<double, d> x;
    

    fuehrt zu
    is not a valid template argument for type ‘double*’ because it is not a constant pointer

    Wie gehts richtig?



  • Probier mal:

    template <typename T, const T* top> class X{} 
    
    static const double d = 1.0;
    
    X<double, &d> x;
    

    edit: const eingefügt (wenn nur lesend auf d zugegriffen wird), ansonsten kannst du bei beiden das const wieder entfernen.



  • In Kurzfassung: Die Template-Paramter muß der Compiler bereits zur Compile-Zeit auflösen. Deshalb kannst du dort keine double-Werte (die werden erst zur Laufzeit von der FPU erzeugt) oder dynamisch angelegte Zeiger übergeben (new holt sich auch erst zur Laufzeit seinen Speicher).



  • Thx.


Anmelden zum Antworten