2017-10-25 2 views
-1

In meinem aktuellen Programmierkurs schreiben wir ein Programm, um ein zufällig gefülltes Array beliebiger Größe zu erstellen. Die Klasse, die das Array enthält, muss templatisiert werden, damit das Array mit Werten von int ODER-Werten von char gefüllt werden kann.Warum habe ich einen nicht definierten Verweis auf die Friend-Funktion?

An diesem Punkt versuche ich nur, die SafeArray-Objekte auszudrucken, damit ich sicherstellen kann, dass mein Code ordnungsgemäß funktioniert. Leider bekomme ich immer noch einen undefinierten Referenzfehler auf meinem überladenen Stream Insertion Operator (< <).

Jede Hilfe wäre willkommen.

Hier ist meine Klassendeklaration:

#include <iostream> 
#include <cassert> 
#include <typeinfo> 
#include <cstdlib> 
#include <ctime> 

using namespace std; 

template <class T> 
class SafeArray 
{ 
private: 
    T* pArr; 
    int size; 
    void create(int); 
public: 
    SafeArray(); 
    SafeArray(int); 
    SafeArray(const SafeArray<T> &); 
    ~SafeArray(); 

    SafeArray& operator=(const SafeArray<T> &); 
    SafeArray operator+(SafeArray<T> &); 
    SafeArray operator-(SafeArray<T> &); 
    int& operator[](int); 

    SafeArray& operator++(); 
    SafeArray operator++(int); 
    int getSize() {return size; } 

    template <class U> 
    friend ostream& operator<<(ostream&, SafeArray<U> &); 
    template <class V> 
    friend istream& operator>>(istream&, SafeArray<V> &); 
}; 

und Einbringungs Definition meine überladene Strom:

template <class T> 
ostream& operator<<(ostream& out, const SafeArray<T> & arr) 
{ 
    for (int i = 0; i < arr.size; i++) 
    { 
     out << arr[i] << " "; 
    } 

    return out; 
} 

Und meine kleine Haupt:

#include "SafeArray.h" 
#include <iostream> 

using namespace std; 

int main() 
{ 
    SafeArray<int> Safe(8); 

    cout << Safe; 

    return 0; 
} 
+0

Wo haben Sie die Definition der Operatorfunktion platziert? – user0042

+0

@ user0042 In SafeArray.cpp, soll es in Haupt sein? Oder muss ich es innerhalb des Klassenheaders definieren? –

+2

Mögliches Duplikat von [Warum können Vorlagen nur in der Header-Datei implementiert werden?] (Https://stackoverflow.com/questions/495021/why-can-templates-only-be-implementiert-in-the-header-file) – user0042

Antwort

0

discrepency von Konstantheit zwischen Erklärung friendness und deine tatsächliche Methodensignatur?

Erklärung friendness:

Vorlage
Freund Ostream & Betreiber < < (ostream &, Safearray &);

Umsetzung:

template Ostream & Operator < < (Ostream & out, const Safearray & arr);

Verwandte Themen