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

manipulator dwuargumentowy

Ostatnio zmodyfikowano 2018-12-15 22:47
Autor Wiadomość
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ę

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



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

C/C++
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 ?
P-173241
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?
P-173243
pekfos
» 2018-12-14 22:34:41
Podaj kod.
P-173244
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"



C/C++
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;
    }
   
};



C/C++
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();
    }
   
};
P-173247
pekfos
» 2018-12-14 23:16:15
ale teraz chce, żeby dodać operator< tylko co w nim ma być
A co chcesz osiągnąć?
P-173248
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
P-173249
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: » Kurs C++ » Poziom 5Wprowadzenie do standardowych algorytmów lekcja, na samym końcu. W tym wypadku byłoby to coś w stylu
C/C++
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;
}
P-173250
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.
P-173254
« 1 » 2
  Strona 1 z 2 Następna strona