template-Spezialisierung



  • Hi,
    ich habe vereinfacht folgenden Code:

    template<typename T, T Base>
        struct GreatestPower
        {
          template<unsigned long Value = Base,
                   unsigned long Max   = sizeof(T) * 8,
                   unsigned long I     = Max - 1>
          struct IncreasePower
          {
            static T const X = IncreasePower<Value, Max, 0>::X;
          };
    
          template<unsigned long Value, unsigned long Max>
          struct IncreasePower<Value, Max, 0>
          {
            static T const X = 0;
          };
    
          static T const X = IncreasePower<>::X;
        };
    

    Der funktioniert auch (macht was er soll). Aber Problem ist, dass der erste Template Parameter bei IncreasePower, also Value, eigentlich den Typ T und nicht unsigned long haben soll.
    Ändere ich das aber (sowohl bei der Definition als auch der Spezialisierung fuer I = 0) kann der g++ offensichtlich die Spezialisierung nicht mehr finden und looped 500 mal bis er die Rekursion wegen Überschreitung des Limits abbricht.

    Frage: ist das nur ein Bug oder wie kommt dieses Verhalten zustande?

    Danke für eure Antworten.


Anmelden zum Antworten