2016-11-07 4 views
0

[EDIT] Ich schreibe eine Template-Klasse mit dem Typ Argument T. In einem der Funktionsmitglieder dieser Klasse wird erwartet, dass eine Variable vom Typ T in ein std::ofstream-Objekt geschrieben wird. Alles ist in Ordnung, bis ich diese Klasse mit einem benutzerdefinierten Typ Argument Fraction instanziieren. Der Fehler tritt auf, obwohl ich die operator << überlastet habe.Binärer 'Operator': kein Operator gefunden, der einen rechten Operanden vom Typ 'Fraction' benötigt (oder es gibt keine akzeptable Konvertierung)

// collection.h 
#include <fstream> 
template<typename T> 
class Collection 
{ 
public: 
    void writeToFile(); 
private:  
    T val; 
}; 

template<typename T> 
inline void Collection<T>::writeToFile() 
{ 
    std::ofstream file("output.txt"); 
    file << val; 

} 

// Fraction.cpp 
#include <iostream> 
std::ostream& operator << (std::ostream& str, const Fraction& f) 
{ 
    std::cout << "Hello"; 
    return str; 
} 
+5

Bitte ** [edit] ** Ihre Frage mit [mcve] oder [SSCCE (kurz, eigenständig, korrektes Beispiel)] (http://sscce.org) – NathanOliver

Antwort

2

Neue Antwort:

Sie müssen beantworten, wie dies in Fraction.h und #include "Fraction.h" vor dem Code operator << mit einer Linie erklären, die es verwendet:

std::ostream& operator << (std::ostream& str, const Fraction& f); 

Das Konzept der Erklärungen vs Definitionen ist grundlegend für C++ (und C), wenn Sie also die Unterscheidung nicht verstehen, durchsuchen Sie das Internet jetzt, um sich weitere Verwirrung zu ersparen.

Edit: Alte Antwort:

Sind Sie sicher, dass Sie wirklich nur file << arr[i] tun und nicht file << somethingElse << arr[i]? Wenn Sie das letztere tun, dann ist der statische Typ von file << somethingElse wahrscheinlich std::ostream& anstatt std::ofstream&. In diesem Fall besteht die Lösung darin, operator<< (..., Fraction) zu ändern, um einen allgemeinen std::ostream& anstelle von std::ofstream& zu akzeptieren (und zurückzugeben).

Bearbeiten: Eine andere Möglichkeit: Sie müssen sicherstellen, dass die Deklaration operator<< (..., Fraction) von der Stelle sichtbar ist, die Sie Collection<Fraction> instanziieren (d. H. Die Deklaration von operator<< ist darüber).

+1

Sie sollten wirklich auf das OP warten, um zu liefern a [mcve]. Gerade jetzt sind das nur Vermutungen. – NathanOliver

+0

@NathanOliver: Ich kann raten, wenn ich will! Es ist nur meine Zeit, die ich verschwenden möchte. –

+0

Ich habe gerade die Frage bearbeitet, um sie klarer und präziser zu machen. – Rickie

Verwandte Themen