`CompareValue' undeclared (first use this function)



  • hi,

    noch ein problem mit Dev 5.0 und folgendem Code der mir obige Fehlermeldung liefert. Woran liegts?

    //---------------------------------------------------------------------------
    //! @brief Basisklasse fuer Vergleiche
    //---------------------------------------------------------------------------
    template <typename T>
    class BaseCompare 
    {
      protected:
    
        const T CompareValue;
    
      public:
    
        // Konstruktoren
        BaseCompare()                  : CompareValue()         {}
        BaseCompare(const T &CmpValue) : CompareValue(CmpValue) {}
    };
    //---------------------------------------------------------------------------
    
    //---------------------------------------------------------------------------
    //! @brief Vergleich "a kleiner b"
    //---------------------------------------------------------------------------
    template <typename T>
    class Less : public BaseCompare<T>
    {
      public:
    
        // Konstruktoren
        Less()                  : BaseCompare<T>()         {}
        Less(const T &CmpValue) : BaseCompare<T>(CmpValue) {}
    
        // Funktionsoperatoren
        bool operator () (const T &lhs)               const { return (lhs < CompareValue); }
        bool operator () (const T &lhs, const T &rhs) const { return (lhs <          rhs); }
    };
    //---------------------------------------------------------------------------
    


  • typename



  • und wo?


  • Mod

    bool operator () (const T &lhs)               const { return (lhs < CompareValue); }
    

    basisklassen einer templateklasse, die von einem templateparameter abhängen, werden bei name lookup nicht durchsucht - hier muss also eine qualifizierte id hin:

    bool operator () (const T &lhs)               const { return (lhs < BaseCompare<T>::CompareValue); }
    


  • verstehe... heisst das also das der borland compiler diesen lookup macht oder einfach nur schlampt?



  • beides



  • camper schrieb:

    bool operator () (const T &lhs)               const { return (lhs < CompareValue); }
    

    basisklassen einer templateklasse, die von einem templateparameter abhängen, werden bei name lookup nicht durchsucht - hier muss also eine qualifizierte id hin:

    bool operator () (const T &lhs)               const { return (lhs < BaseCompare<T>::CompareValue); }
    

    Das ist nicht unbedingt notwendig, ein

    this->CompareValue
    

    reicht schon vollkommen aus.

    Sunday schrieb:

    verstehe... heisst das also das der borland compiler diesen lookup macht oder einfach nur schlampt?

    Er prüft einfach auch die Member in der Basisklasse, aber generell ist man gut beraten in Templates mit this-> zu arbeiten um irgendwelchen Problemen vorzubeugen.

    BR
    evilissimo


Anmelden zum Antworten