Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » probleme mit template

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
07.07.2007, 23:16 Uhr
Botz3000



Hallo erstmal!
Bin grad an diesem Buch "C++ in 21 Tagen" (ich weiss, dass solche bücher nicht unbedingt halten was sie versprechen aber ist zumindest ein anfang), hab auch schon gemerkt dass die Listings von vorne bis hinten voll mit Fehlern sind, hab die aber bis jetzt selbst beheben können. Naja, und ich bin jetzt bei Listing 19.4 hängengeblieben, weil das einfach nicht hinhauen will. Irgendwas passt mit dem operator nicht glaube ich. Ich hab sogar schon das komplette listing aus dem Buch kopiert und das dann benutzt, aber immer noch der selbe Fehler.

Hier ist mal das Listing:

C++:
// Typenspezifische friend-Funktion in Template

// AHHHHH!!!!!
#include <iostream>
using namespace std;
const int DefaultSize = 10;

class Animal
{
public:
    Animal(int);
    Animal();
    ~Animal(){}
    int GetWeight()const{return itsWeight;}
    void Display()const{cout << itsWeight;}
private:
    int itsWeight;
};

Animal::Animal(int weight):
itsWeight(weight)
{}

Animal::Animal():
itsWeight(0)
{}

template <class T>        
class Array
{
public:
    Array(int itsSize = DefaultSize);
    Array(const Array &rhs);
    ~Array(){delete [] pType;}

    Array& operator= (const Array&);
    T& operator[] (int offSet) {return pType[offSet];}
    const T& operator[] (int offSet) const {return pType[offSet];}

    int GetSize()const {return itsSize;}

    friend ostream& operator<< (ostream&, Array&);
private:
    T *pType;
    int itsSize;
};

template <class T>
ostream& operator<< (ostream& output, Array<T>& theArray)
{
    for (int i = 0; i<theArray.GetSize(); i++)
        output << "[" << i << "] " << theArray[i] << endl;
    return output;
}

template <class T>
Array<T>::Array(int size):
itsSize(size)
{
    pType = new T[size];
    for (int i = 0; i < size; i++)
        pType[i] = 0;
}

template <class T>
Array<T>::Array(const Array &rhs)
{
    itsSize = rhs.GetSize();
    pType = new T[itsSize];
    for (int i=0; i<itsSize; i++)
        pType[i] = rhs[i];
}

template <class T>
Array<T>& Array<T>::operator= (const Array &rhs)
{
    if (this == &rhs)
        return *this;
    delete [] pType;
    itsSize = rhs.GetSize();
    pType = new T[itsSize];
    for (int i = 0; i < itsSize; i++)
        pType[i] = rhs[i];
    return *this;
}

int main()
{
    bool Stop = false;        // wozu auch immer...
    int offset, value;
    Array<int> theArray;

    while (!Stop)
    {
        cout << "Offset (0-9) ";
        cout << "und Wert (-1 fuer Abbruch) eingeben: ";
        cin >> offset >> value;
        if (offset < 0)
            break;
        if (offset > 9)
        {
            cout << "***Bitte Werte zwischen 0 und 9.***\n";
            continue;
        }

        theArray[offset] = value;
    }
    cout << "\n Hier das vollstaendige Array: \n";
    cout << theArray << endl;
    return 0;
}


Die Fehlermeldung ist folgende:
source.obj : error LNK2019: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Array<int> &" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$Array@H@@@Z) referenced in function _main
Debug/19.4 Einsatz des ostream-Operators.exe : fatal error LNK1120: 1 unresolved externals

Hab mich umgeschaut und hab bis jetzt nicht wirklich eine funktionierende Lösung finden können. Ich benutze Visual Studio.NET 2003.

Wäre super wenn mir jemand helfen könnte.

Dieser Post wurde am 07.07.2007 um 23:19 Uhr von Botz3000 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.07.2007, 02:32 Uhr
Botz3000



oh hab ich den thread wirklich 'problem mit template' genannt? hätte eigentlich 'problem mit operator' heissen sollen
Den Fehler verursacht genau diese stelle: cout << theArray in der vorletzten zeile.

Dieser Post wurde am 08.07.2007 um 02:44 Uhr von Botz3000 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.07.2007, 02:47 Uhr
Kest
saint


Hi!

Friend's sind keine einfache Klassenfunktionen.
In deinem Fall sucht die nach

C++:
std::ostream& operator<<(std::ostream&, const A<int>&)

die es nicht gibt. So eine Funktion hättest du auch definieren können, würde aber wenig Sinn machen, denn dann bräuchste auch für jeden Typ so eine Funktion zu schreiben.

Lösung ist einfach: die friend-Funktion als template zu qualifizieren:


C++:
template <class T>        
class Array
{
//...
template<class Typ> friend std::ostream& operator<<(std::ostream&, const Array<Typ>&);
//...
};

--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.

Dieser Post wurde am 08.07.2007 um 02:48 Uhr von Kest editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.07.2007, 03:22 Uhr
Botz3000



Ahaa! Dass ich da nicht draufgekommen bin ist ja schon peinlich
Der Herr, der das Buch geschrieben (oder übersetzt) hat, hat genau den selben Fehler in 4 aufeinander folgenden Listings gemacht...

Danke!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: