2016-01-31 2 views
0

Premièrement: J'ai essayé de lire et de modifier mon code basé sur au moins 7 autres questions similaires. Au mieux, les autres options déclenchent une avalanche d'erreurs. Avec mon code actuel, je suis en panne d'une seule erreur.erreur: impossible de lier 'std :: ostream dans le fichier d'implémentation

Mettre à l'intérieur de la classe et en utilisant « ami » ne fonctionne pas, et en utilisant ostream & opérateur < < (ostream & out, Fraction & rhs const) fait plus d'erreurs tout beaucoup. La chose frustrante est que dans c9.io ce code fonctionne, mais pas sur Netbeans.

Dans mon main.cpp:

#include <iostream> 
#include "fraction.h" 
using namespace std; 
int main() { 
    Fraction f(3, 4); 
    cout << f; 
    return 0; 
} 

En fraction.h:

#ifndef FRACTION_H 
#define FRACTION_H 

class Fraction{ 
    public: 
     //constructor defs    
     //accessors   
     //modifiers/mutators 
     void setNumer(int newNum); 
     void setDenom(int newDenom); 
     void reduce(); 

    private: 
     //instance variables 
     int numer; 
     int denom; 
     //helper functions 
     int gcd(int a, int b); 
}; 
#endif /* FRACTION_H */ 

Et fraction.cpp:

#include "fraction.h" 
#include <cmath> 
#include <iostream> 
using namespace std; 

//code for constructors 

//accessors 
int Fraction::getNumer(){ 
    return numer; 
} 

int Fraction::getDenom(){ 
    return denom; 
} 

//modifiers/mutators 

//other operator definitions 

ostream& operator<< (ostream &out, Fraction &rhs){ 
    if(rhs.getNumer() == 0){ 
     out << 0; 
    } else if(rhs.getNumer() == rhs.getDenom()){ 
     out << 1; 
    } else { 
     rhs.reduce(); 
     out << rhs.getNumer() << "/" << rhs.getDenom(); 
    } 
} 

La sortie est:

g++ -c -g -std=c++11 -MMD -MP -MF "build/Debug/GNU-Linux/main.o.d" -o build/Debug/GNU-Linux/main.o main.cpp 
main.cpp: In function ‘int main()’: 
main.cpp:6:13: error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’ 
    cout << f; 
      ^
In file included from /usr/include/c++/4.8/iostream:39:0, 
       from main.cpp:1: 
/usr/include/c++/4.8/ostream:602:5: error: initializing argument 1 of ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = Fraction]’ 
    operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x) 
    ^

Répondre

1

Il n'y a aucune connaissance de la fonction operator<< qui est définie dans Fraction.cpp dans main.cpp Par conséquent, la ligne

cout << f; 

est un problème. Ajoutez la déclaration de la fonction dans le fichier .h.

#ifndef FRACTION_H 
#define FRACTION_H 

#include <iostream> 

class Fraction{ 
    public: 
     //constructor defs    
     //accessors   
     //modifiers/mutators 
     void setNumer(int newNum); 
     void setDenom(int newDenom); 
     void reduce(); 

    private: 
     //instance variables 
     int numer; 
     int denom; 
     //helper functions 
     int gcd(int a, int b); 
}; 

std::ostream& operator<< (std::ostream &out, Fraction const& rhs); 
//             ^^^^ Using const&, not just Fraction& 

#endif /* FRACTION 
+0

Fermer, mais pas de cigare. Comme je l'ai dit, ajouter "const" provoque une avalanche d'erreurs supplémentaires: 'g ++ -c -g -std = C++ 11 -MMD -MP -MF" build/Debug/GNU-Linux/fraction.od "-o build/Debug/GNU-Linux/fraction.o fraction.cpp fraction.cpp: Dans la fonction 'std :: ostream & opérateur << (std :: ostream &, const Fraction &)': fraction.cpp: 88: 21: erreur : en passant 'const Fraction' comme 'this' argument de 'int Fraction :: getNumer()' ignore les qualificatifs [-fpermissive] if (rhs.getNumer() == 0) { ^ fraction.cpp: 90: 28 : erreur: en passant 'const Fraction' comme 'this' argument de 'int Fraction :: getNumer()' di' – SkippOtter

+0

@SkippOtter, assurez-vous que 'getNumer()' et 'getDenom()' sont des fonctions membres 'const'. –

+0

deux problèmes: l'ajout du mot-clé const à la fois à la déclaration dans function.h et à la définition dans function.cpp ne fait rien, l'erreur reste la même. Et, j'ai des getters et des setters pour num et denom, donc ils ne peuvent pas être const, non? – SkippOtter

0

La réponse est en partie ce que @ r-Sahu dit: je devais mettre getNumer() et getDenom() comme const fonctions membres, mais je ne pouvais obtenir les erreurs disparaissent SANS utiliser const& dans la définition de la fonction.

Bon:

std::ostream& operator<< (std::ostream &out, Fraction rhs);

Pas bon:

std::ostream& operator<< (std::ostream &out, Fraction const& rhs);

Il compile maintenant et fonctionne. Avez-vous un aperçu de la raison pour laquelle le membre fonctionne const mais ne réussit pas la Fraction? const le fait fonctionner? Je suis tombé par hasard sur cette solution et je ne la comprends pas.

+0

Vous avez probablement appelé des fonctions membres non-const telles que 'gcd' dans' operator << '. La bonne approche est de garder 'std :: ostream & operator << (std :: ostream & out, Fraction const & rhs);' et de corriger ces choses –