manipulator dwuargumentowy
Ostatnio zmodyfikowano 2018-12-15 22:47
desty Temat założony przez niniejszego użytkownika |
manipulator dwuargumentowy » 2018-12-14 20:33:00 Zrobiłem program który odczytuje dane z pliku i zapisuje je do kontenera i zlicza ilość. Problem pojawia się przy "color" zrobiłem strukturę struct color { unsigned char red; unsigned char green; unsigned char blue; };
wczytuje plik o rozszerzeniu ppm w którym każdy piksel składa się z 3 kolorów rgb. w szablonie robię klasę która posiada metodę do wczytywania danych z pliku do kontenera map std::fstream plik( sciezkapliku, std::ios::in );
while( plik >> tekst ) { kontener[ tekst ] ++; }
gdzie zmienna tekst w tym przypadku ma typ color, a mapa w tym przypadku ma wartości map<color,int>kontener. Żeby program działał muszę zrobić operator >> dla color friend std::fstream & operator >>( std::fstream & plik, color & s ) { plik >> s.red >> s.green >> s.blue; return plik; }
zrobiłem takie przeciążenie operatora>> ale przy próbie włączenia programu wywala błąd o braku odpowiedniego operatora>> dla tego typu. Gdzie jest błąd ? |
|
michal11 |
» 2018-12-14 22:20:27 Pokaz dokładnie jaki masz błąd. Jak rozumiem jest to błąd kompilacji? Jakiego kompilatora używasz? |
|
pekfos |
» 2018-12-14 22:34:41 Podaj kod. |
|
desty Temat założony przez niniejszego użytkownika |
» 2018-12-14 23:02:12 Problem pojawiał się przez to że operator dałem w klasie a nie strukturze,ale teraz chce, żeby dodać operator< tylko co w nim ma być wyskakuje błąd dwuargumentowy "<": nie znaleziono żadnego operatora, który przyjmuje lewostronny operand typu "const _Ty" struct color { unsigned char red; unsigned char green; unsigned char blue; friend std::fstream & operator >>( std::fstream & plik, color & s ) { plik >> s.red >> s.green >> s.blue; return plik; } };
template < typename T > class freqcounter { private: std::map < T, int > kontener; T tekst; public: inline void add( std::string sciezkapliku ) { std::fstream plik( sciezkapliku, std::ios::in ); while( plik >> tekst ) { kontener[ tekst ] ++; } plik.close(); } };
|
|
pekfos |
» 2018-12-14 23:16:15 ale teraz chce, żeby dodać operator< tylko co w nim ma być |
A co chcesz osiągnąć? |
|
desty Temat założony przez niniejszego użytkownika |
» 2018-12-14 23:22:46 No wyskakuje błąd, że nie ma operatora< I nie wiem jak on powinien wyglądać i co mieć w sobie |
|
pekfos |
» 2018-12-14 23:32:56 Wyskakuje błąd, bo próbujesz użyć color jako klucza w std::map<>. Operator < powinien wyglądać jak operator < i spełniać wymagania std::map<>. Możesz przeczytać więcej tu: Wprowadzenie do standardowych algorytmów, na samym końcu. W tym wypadku byłoby to coś w stylu bool operator <( const color & _c ) const { if( red != _c.red ) return red < _c.red; if( green != _c.green ) return green < _c.green; return blue < _c.blue; } |
|
mateczek |
» 2018-12-15 18:44:31 kontener[ tekst ] ++; usiłujesz zrobić licznik pikseli o określonym kolorze?? Kontener map sortuje wpisy dlatego potrzebuje operatora by porównać który kolor jest większy a który mniejszy. jeśli nie chcesz sortowania to użyj std::unordered_map. A jeśli chcesz sortowanie to niestety za pomocą tego operatora musisz dostarczyć do kontenera mechanizm, który potrafi porównać kolory. |
|
« 1 » 2 |