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)
^
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
@SkippOtter, assurez-vous que 'getNumer()' et 'getDenom()' sont des fonctions membres 'const'. –
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