[C++] std::hash - problem z kompilacją
Ostatnio zmodyfikowano 2024-01-13 20:27
madpl1239 Temat założony przez niniejszego użytkownika |
[C++] std::hash - problem z kompilacją » 2024-01-13 20:18:23 Witam serdecznie. Jestem dość doświadczonym programistą - ale znowu C++ ściągnął mnie w dół i muszę prosić o pomoc. A mianowicie, w poniżej zamieszczonym fragmencie kodu pojawiają mi się błedy kompilacji: namespace std { template < > struct hash < Point > { size_t operator()( const Point & p ) const { return hash < int >( p.x ) ^ hash < int >( p.y ); } }; }
jak zamienię instrukcję return na taką: return hash < int >()( p.x ) ^ hash < int >()( p.y );
to jest ok. Czy mógłby mi ktoś wyłożyć o co chodzi, bo dostałem już "pomroczności jasnej". Z góry dziękuję. |
|
DejaVu |
» 2024-01-13 20:27:22 https://chat.openai.com/share/f92a4d07-7e54-49ce-a9be-f116cea312c5Witam serdecznie! Cieszę się, że mogę pomóc. Problem, z którym się spotykasz, jest związany z niepoprawnym użyciem standardowego szablonu funkcji std::hash w języku C++. Twoja pierwotna linijka kodu: return hash < int >( p.x ) ^ hash < int >( p.y );
stara się użyć konstruktora std::hash<int> do bezpośredniego haszowania wartości p.x i p.y, co nie jest poprawne. W języku C++, std::hash<T> jest szablonem klasy, a nie funkcją. Oznacza to, że musisz najpierw utworzyć instancję tej klasy, a następnie użyć jej do haszowania wartości. Poprawiony fragment kodu: return hash < int >()( p.x ) ^ hash < int >()( p.y );
jest prawidłowy, ponieważ tworzysz tymczasowe obiekty std::hash<int> i następnie używasz operatora nawiasów, aby wywołać funkcję operator(), która rzeczywiście wykonuje haszowanie dla wartości p.x i p.y. Podsumowując: hash<int>(p.x) jest błędne, ponieważ próbuje wywołać konstruktor z wartością p.x, co nie jest prawidłowym użyciem std::hash. hash<int>()(p.x) jest poprawne, ponieważ najpierw tworzy obiekt typu hash<int>, a następnie używa tego obiektu do haszowania wartości p.x poprzez operator (). Mam nadzieję, że to wyjaśnienie jest jasne i pomoże Ci w dalszej pracy z C++. Jeśli masz więcej pytań lub wątpliwości, śmiało pytaj! |
|
« 1 » |