Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] std::hash - problem z kompilacją

Ostatnio zmodyfikowano 2024-01-13 20:27
Autor Wiadomość
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:
C/C++
namespace std
{
   
template < >
   
struct hash < Point >
   
{
       
size_t operator()( const Point & p ) const
       
{
           
return hash < int >( p.x ) ^ hash < int >( p.y ); // <--- error, dlaczego?
       
}
    }
;
}

jak zamienię instrukcję return na taką:
C/C++
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ę.
P-180577
DejaVu
» 2024-01-13 20:27:22
https://chat.openai.com/share/f92a4d07-7e54-49ce-a9be-f116cea312c5

Witam 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:

C/C++
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:

C/C++
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!
P-180578
« 1 »
  Strona 1 z 1