BlueBles Temat założony przez niniejszego użytkownika |
Przeładowanie strumienia wyjścia i template » 2019-05-22 23:31:15 Witajcie zetknąłem się z problemem przeładowania operatora wypisania, otóż posiadam Macierz która posiada wartości jednego z typów int/Punkt3D/LiczbaZespolona otóż punkt w przestrzeni wypisuje prawidłowo, jednak mimo tego, że identycznie wyglądają ich przeciążenia nie mogę wywołać Macierz<Zespolona> błąd to Błąd C2995 "std::ostream &operator <<(std::ostream &,const typdanych &)": szablon funkcji został już zdefiniowany Klasa macierzy template < class typ > class Macierz { private: int kolumny, wiersze; vector < vector < typ >> macierz; public: Macierz( int kol, int wier ) { this->kolumny = kol; this->wiersze = wier; macierz.resize( wiersze, vector < typ >( kolumny, 0 ) ); } template < class typdanych > friend ostream & operator <<( std::ostream & stream, const typdanych & matrix ) { for( int i = 0; i < matrix.wiersze; i++ ) { cout << "|"; for( int p = 0; p < matrix.kolumny; p++ ) { stream << showpos << right; stream << setw( 5 ); stream << matrix.macierz[ i ][ p ]; } cout << " |" << endl; } cout << endl; return stream; }
wypisanie w klasie zespolone friend ostream & operator <<( std::ostream & stream, const Zespolona & XYZ ) { stream << XYZ.Rzeczywista << " + i" << XYZ.czescZespolona; return stream; }
wypisanie w klasie punkt3d friend ostream & operator <<( std::ostream & stream, const Punkt & XYZ ) { cout << XYZ.x << "X " << XYZ.y << "Y " << XYZ.z << "Z "; return stream; }
main
Macierz < Punkt > pierwsza( 1, 1 ); Macierz < Punkt > druga( 1, 1 ); pierwsza.wypelnijPunktami(); druga.wypelnijPunktami(); cout << "Pierwsza" << endl; cout << pierwsza; cout << "Druga" << endl; cout << druga; cout << "dodawanie" << endl; cout << pierwsza + druga; cout << "odejmowanie" << endl; cout << pierwsza - druga;
Punkt3d https://pastebin.com/8Ss9ZdAN Zespolone https://pastebin.com/ZsXHqMcj Macierz https://pastebin.com/1zxr9ijg Main https://pastebin.com/gyVppCG7 |
|
pekfos |
» 2019-05-23 00:30:00 template < class typdanych > friend ostream & operator <<( std::ostream & stream, const typdanych & matrix ) { |
Dlaczego to jest szablon? Argument powinien być typu Macierz. |
|
BlueBles Temat założony przez niniejszego użytkownika |
Zmienione jednak -> c2440 » 2019-05-23 15:08:15 Dziękuje za znalezienie błędu, faktycznie rozpędziłem się w template, jednak po zmianie tego wyskakuje błąd
Błąd C2440 "<function-style-cast>": nie można konwertować z "initializer list" na "std::vector<typ,std::allocator<_Ty>>" with [
typ=Zespolona, _Ty=Zespolona ] Macierze |
|
BlueBles Temat założony przez niniejszego użytkownika |
Działa » 2019-05-23 15:28:35 Błędem była zbyt duża ilość konstruktorów w klasie liczb zespolonych, podczas ustawiania rozmiaru macierzy, nie wiedział jaki konstruktor użyć, usuniecie 2 z 3 konstruktorów, okazało się idealnym rozwiązaniem, program działa tak jak zakładałem. Dziękuję za pomoc pekfos. |
|
pekfos |
» 2019-05-23 15:29:56 macierz.resize( wiersze, vector < typ >( kolumny, 0 ) );
|
Strzelam, że chodzi o ten fragment kodu. Zamiast zera lepiej użyć typ(), albo typ{} jeśli piszesz w C++11 lub nowszym. Następnym razem podając treść błędu podaj jakoś miejsce w kodzie, o którym mówi kompilator. Nie zaszkodzi też wrzucać kod jako jeden plik, żeby łatwiej go móc samemu skompilować / przetestować. Jak wstawiać kod na forum? |
|
BlueBles Temat założony przez niniejszego użytkownika |
» 2019-05-23 22:54:11 Tak chodziło dokładnie o to miejsce (faktycznie mogłem dodać). Dziękuję za wskazówki jak i za pomoc. |
|
« 1 » |