Matroids Matheplanet Forum Index
Forumbereich moderiert von: matph
Informatik » Programmieren » Fehler beim Überladen des Ausgabeoperators im Zusammenhang mit templates (C++)
Druckversion
Druckversion
Universität/Hochschule J Fehler beim Überladen des Ausgabeoperators im Zusammenhang mit templates (C++)
Lux93 Aktiv Letzter Besuch: im letzten Quartal
Mitglied seit: 16.07.2012, Mitteilungen: 110
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum ersten Beitrag
Themenstart: 2020-09-19

Hallo,

es geht um das beigefügte Programm, welches ich zunächst ohne Verwendung von templates für einen festen Datentyp (int) erstellt habe. Dabei lief es ohne Fehlermeldungen des Compilers.

Ich habe nun versucht, das Programm in analoger Weise mit templates zu erstellen, wobei der Compiler die im Screenshot beigefügten Fehlermeldungen ausgibt.

Ich bin mir bei der Interpretation der Fehlermeldungen nicht wirklich sicher und bin durch eigenes Suchen im Internet nicht wirklich schlauer geworden; insbesondere, weil es als reine ,,int-Version'' funktioniert.

Die Datei vec2d.h:
C++
#include <iostream>
#include <cmath>
using namespace std;
 
#ifndef POLYGON2D_VEC2D_HPP
#define POLYGON2D_VEC2D_HPP
 
template <typename T>
class Vec2D {
private:
    T _x, _y;
public:
    Vec2D(): _x(0), _y(0) {};
    Vec2D(T x, T y): _x(x), _y(y) {};
 
    T getX() const;
    T getY() const;
    void setX(T x);
    void setY(T y);
 
    Vec2D operator+ (const Vec2D &v) const;
    Vec2D operator- (const Vec2D &v) const;
    Vec2D operator* (const  &skalar) const;
    Vec2D operator/ (const  &skalar) const;
 
 
    friend ostream& operator<< (ostream &os, const Vec2D<T> &v);
 
    double length() const;
    double distanceTo(Vec2D v) const;
    static double dotProduct(Vec2D a, Vec2D b);
};
#endif //POLYGON2D_VEC2D_HPP
 
template <typename T>
T Vec2D<T>::getX() const {
    return _x;
}
 
template <typename T>
T Vec2D<T>::getY() const {
    return _y;
}
 
template <typename T>
void Vec2D<T>::setX(T x) {
    _x = x;
}
 
template <typename T>
void Vec2D<T>::setY(T y) {
    _y = y;
}
 
template <typename T>
Vec2D<T> Vec2D<T>::operator+ (const Vec2D &v) const {
    Vec2D res;
    res._x = _x + v._x;
    res._y = _y + v._y;
    return res;
}
 
template <typename T>
Vec2D<T> Vec2D<T>::operator- (const Vec2D &v) const {
    Vec2D res;
    res._x = _x - v._x;
    res._y = _y - v._y;
    return res;
}
 
template <typename T>
Vec2D<T> Vec2D<T>::operator* (const &skalar) const {
    Vec2D res;
    res._x = _x * skalar;
    res._y = _y * skalar;
    return res;
}
 
template <typename T>
Vec2D<T> Vec2D<T>::operator/ (const &skalar) const {
    Vec2D res;
    res._x = _x / skalar;
    res._y = _y / skalar;
    return res;
}
 
template <typename T>
ostream& operator<< (ostream &os, const Vec2D<T> &v) {                                 // ?????????????????????????????????????????
    return os << "(" << v.getX() << ", " << v.getY() << ")";
}
 
template <typename T>
double Vec2D<T>::length() const {                            
    return sqrt(pow(_x, 2) + pow(_y, 2));
}
 
template <typename T>
double Vec2D<T>::distanceTo(Vec2D v) const {               
    return (v-Vec2D(_x, _y)).length();                        
}
 
//a = Vec2D(_x, _y), b = v
template <typename T>
double Vec2D<T>::dotProduct(Vec2D a, Vec2D b) {          
    return (a._x * b._x) + (a._y * b._y);
}
 

Die Datei polygon2d.h:
C++
#include "vec2d.h"
#include <stdexcept>
#ifndef POLYGON2D_POLYGON2D_HPP
#define POLYGON2D_POLYGON2D_HPP
 
template <typename T>
class Poly2D {
private:
    Vec2D<T>* _points;
    int _size;
    int _next;
    bool isFull();
public:
    Poly2D();                                   
    Poly2D(Vec2D<T>* points, int size);
    Poly2D(const Poly2D& p);                    
    ~Poly2D();                                  
 
    int getNext() const;
    Vec2D<T> getPoint(int n) const;
    void setPoint(Vec2D<T> point);
 
    double circumference();
    double area();
 
    friend ostream& operator<< (ostream &os, const Poly2D<T> &p);
};
 
#endif //POLYGON2D_POLYGON2D_HPP
 
template <typename T>
Poly2D<T>::Poly2D() {
    _size = 10;
    _next = 0;
    _points = new Vec2D<T>[_size];
}
 
template <typename T>
Poly2D<T>::Poly2D(Vec2D<T> *points, int size) {
    _size = size;
    _points = new Vec2D<T>[_size];
    for (int i = 0; i < _size; i++)
        _points[i] = points[i];
    _next = _size;
}
 
template <typename T>
Poly2D<T>::Poly2D(const Poly2D<T>& p) {
    _size = p._size;
    _next = p._next;
    for (int i = 0; i <= _next; i++)
        _points[i] = p._points[i];
}
 
template <typename T>
Poly2D<T>::~Poly2D() {
    delete [] _points;
}
 
template <typename T>
bool Poly2D<T>::isFull() {
    return _next == _size;
}
 
template <typename T>
int Poly2D<T>::getNext() const {
    return _next;
}
 
template <typename T>
Vec2D<T> Poly2D<T>::getPoint(int n) const {
    if (n < 0 || n >= _next)
        throw out_of_range("out of bounds");
    return _points[n];
}
 
template <typename T>
void Poly2D<T>::setPoint(Vec2D<T> point) {
    if (isFull())
        throw runtime_error("no available space in polygon");
    _points[_next] = point;
    _next++;
}
 
template <typename T>
double Poly2D<T>::circumference() {
    if (_next < 3)
        throw runtime_error("Umfangsberechnung nicht möglich! Polygon hat mindestens 3 Ecken!");
    double sum = 0;
    for (int i = 0; i < _next-1; i++)
        sum += _points[i].distanceTo(_points[i+1]);
    sum += _points[_next-1].distanceTo(_points[0]);
    return sum;
}
 
template <typename T>
double Poly2D<T>::area() {
    if (_next < 3)
        throw runtime_error("Flächenberechnung nicht möglich! Polygon hat mindestens 3 Ecken!");
    double sum = 0.0;
    for (int i = 0; i < _next; i++)
        sum += (_points[i].getX() - _points[(i + 1) % _next].getX()) * (_points[i].getY() + _points[(i + 1) % _next].getY());
    return abs(sum / 2.0);
}
 
template <typename T>
 ostream& operator<< (ostream &os, const Poly2D<T> &p) {
     for (int i = 0; i < p.getNext(); i++)
         os << p.getPoint(i) << endl;
     return os;
 }
 

Die Datei main.cpp:
C++
#include <iostream>
#include "polygon2d.h"
using namespace std;
 
 
int main() {
    Vec2D<double> v0 = Vec2D<double>(2.7, 4.9);
    Vec2D<double> v1 = Vec2D<double>(9.7, 4.9);
    Vec2D<double> v2 = Vec2D<double>(9.7, 12.65);
    Vec2D<double> v3 = Vec2D<double>(2.7, 12.65);
    //Vec2D<int> v4 = Vec2D<int>(-2, -3);
 
    Vec2D<double>* v = new Vec2D<double>[4];
    v[0] = v0;
    v[1] = v1;
    v[2] = v2;
    v[3] = v3;
    //v[4] = v4;
    Poly2D<double> P = Poly2D<double>(v, 4);
 
    Poly2D<double> p = Poly2D<double>();
 
    p.setPoint(v0);
    p.setPoint(v1);
    p.setPoint(v2);
    p.setPoint(v3);
    //p.setPoint(v4);
    cout << "Punkt 1: " << p.getPoint(0) << endl;
    cout << "Punkt 2: " << p.getPoint(1) << endl;
    cout << "Punkt 3: " << p.getPoint(2) << endl;
    cout << "Punkt 4: " << p.getPoint(3) << endl;                 
 
    double umfang = p.circumference();
    double flaeche = p.area();
    cout << "Umfang des Polygons: " << umfang << endl;
    cout << "Fläche des Polygons: " << flaeche << endl;
 
    cout << p << endl;
    cout << P << endl;
 
    return 0;
}
 



Über Hilfe würde ich mich sehr freuen.



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
ligning Senior Letzter Besuch: in der letzten Woche
Mitglied seit: 07.12.2014, Mitteilungen: 3187, aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum ersten Beitrag
Beitrag No.1, eingetragen 2020-09-19

Aktivier mal die Compilerwarnungen, der sagt einem eigentlich was los ist.


-----------------
⊗ ⊗ ⊗



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
Lux93 Aktiv Letzter Besuch: im letzten Quartal
Mitglied seit: 16.07.2012, Mitteilungen: 110
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum ersten Beitrag
Beitrag No.2, vom Themenstarter, eingetragen 2020-09-19

Soweit ich das beurteilen kann, sind die Compilerwarnungen bei mir aktiviert. Ich habe diesbezüglich noch nie etwas an den Einstellungen verändert und bei anderen Programmen auch schon Warnungen vom Compiler bekommen.



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
ligning Senior Letzter Besuch: in der letzten Woche
Mitglied seit: 07.12.2014, Mitteilungen: 3187, aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum ersten Beitrag
Beitrag No.3, eingetragen 2020-09-19

Die erste Fehlermeldung, die ich kriege:
vec2d.h:23:30: error: ISO C++ forbids declaration of ‘skalar’ with no type [-fpermissive]
     Vec2D operator* (const  &skalar) const;
                              ^~~~~~

Da fehlt der Typ, wohl ein T.

Wenn man das fixt ...
vec2d.h:27:63: warning: friend declaration ‘std::ostream& operator<<(std::ostream&, const Vec2D<T>&)’ declares a non-template function [-Wnon-template-friend]
     friend ostream& operator<< (ostream &os, const Vec2D<T> &v);
                                                               ^

Hab ich so gelöst:
C++
template<typename U> friend ostream& operator<< (ostream &os, const Vec2D<U> &v);

Und dann läuft es.





Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
Lux93 Aktiv Letzter Besuch: im letzten Quartal
Mitglied seit: 16.07.2012, Mitteilungen: 110
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum ersten Beitrag
Beitrag No.4, vom Themenstarter, eingetragen 2020-09-21

Okay, durch diese Änderung habe ich dann auch keine Fehlermeldungen mehr.

Vielen Dank für deine Hilfe.



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
Lux93 hat die Antworten auf ihre/seine Frage gesehen.
Lux93 hat selbst das Ok-Häkchen gesetzt.
Neues Thema [Neues Thema]  Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2020 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]