Hashing problem



  • Hallo,

    ich habe eine Classe CDefinition und will einen Container(hash_set) mit den Pointer aof Definitions aufbauen.

    In Class CDefinitionContainer header:

    private:
    	stdext::hash_set<CDefinition*,definitionhasher> m_theDefinitions;
    

    und in der .cpp versuche ich den Iterator aufzuruffen(darauf bezieht sich auch die Fehlermeldung):

    typedef hash_set<CDefinition*,definitionhasher>::iterator  iter_def;
    

    In Class CDefinition

    bool operator<( CDefinition const& a){
    			return this->m_strSymbolName < a.m_strSymbolName ;
    		}
    

    und die definitionhasher schaut so aus:

    class definitionhasher : public stdext::hash_compare<CDefinition*>
    {
    public:
    
     size_t operator() (const CDefinition* &s) const{
        size_t h = 0;
    	std::string::const_iterator p, p_end;
    	for(p = s->m_strSymbolName.begin(), p_end = s->m_strSymbolName.end(); p != p_end; ++p)
        {
          h = 31 * h + (*p);
        }
        return h;
      }
    
    bool operator() (const CDefinition* &s1, const CDefinition* &s2) const
      {
    	  return s1->m_strSymbolName < s2->m_strSymbolName;
      }
    
    };
    

    Die HashFunktion wird über die Variable DefinitionName aufgebaut, der einen String is. Es scheint jedoch dass ich problemmen mit dem < Operator habe.

    die 1-te VS.Net Fehlermeldung schaut so aus:

    c:\Documents and Settings\Gerhard\My Documents\Visual Studio Projects\diplom\hashing\CDefinitionContainer.cpp(67): error C2676: binary '<' : 'iter_def' does not define this operator or a conversion to a type acceptable to the predefined operator
    


  • gar keine Ideen?



  • Du hast eine Vergleichsoperation für ordinäre CDefinition-Zeiger definiert, aber nicht für hash_set-Iteratoren (und üblicherweise lassen sich STL-Iteratoren nicht in ordinäre Pointer umwandeln). Versuch mal, den binären definitionhasher::operator() in ein Template umzuwandeln.


Anmelden zum Antworten