I'm getting this infamous error when i try to compile this...
fraction\fraction.h(18) : fatal error C1001: INTERNAL COMPILER ERROR
(compiler file 'msc1.cpp', line 1786)
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
client.cpp
fraction\fraction.h(17) : fatal error C1001: INTERNAL COMPILER ERROR
(compiler file 'msc1.cpp', line 1786)
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
Error executing cl.exe.
Code:
#ifndef FRACTION_H
#define FRACTION_H
#include <iostream>
using namespace std;
class Fraction {
public:
Fraction();
Fraction(int);
Fraction(int, int);
double getFraction() const {return ((double) numerator / denominator);}
int getNumerator() const {return numerator;}
int getDenominator() const {return denominator;}
friend const Fraction operator+ (const Fraction& x, const Fraction& y);
friend const Fraction operator- (const Fraction& x, const Fraction& y);
friend const Fraction operator* (const Fraction& x, const Fraction& y);
friend const Fraction operator/ (const Fraction& x, const Fraction& y);
friend bool operator == (const Fraction& x, const Fraction& y);
friend const Fraction operator- (const Fraction&);
friend ostream& operator<< (ostream& x, const Fraction& y);
friend istream& operator>> (istream& x, Fraction& y);
private:
void reduce();
int gcd(int, int);
int numerator, denominator;
};
#endif
----------------------------
#include <iostream>
#include <cmath>
#include <string>
#include "Fraction.h"
using namespace std;
Fraction::Fraction() : numerator(0), denominator(1) { }
Fraction::Fraction(int n) : numerator(n), denominator(1) { }
Fraction::Fraction(int n, int d) {
if (0 == d) {
cout << "Illegal value for denominator" << endl;
exit(1);
}
numerator = n;
denominator = d;
}
const Fraction operator+ (const Fraction& f1, const Fraction& f2) {
int d3 = f1.denominator * f2.denominator;
int n1 = f2.denominator * f1.numerator;
int n2 = f1.denominator * f2.numerator;
int n3 = n1 + n2;
Fraction f(n3, d3);
f.reduce();
return f;
}
const Fraction operator- (const Fraction& f1, const Fraction& f2) {
int d3 = f1.denominator * f2.denominator;
int n1 = f2.denominator * f1.numerator;
int n2 = f1.denominator * f2.numerator;
int n3 = n1 - n2;
Fraction f(n3, d3);
f.reduce();
return f;
}
const Fraction operator* (const Fraction& f1, const Fraction& f2) {
int n3 = f1.numerator * f2.numerator;
int d3 = f1.denominator * f2.denominator;
Fraction f(n3, d3);
f.reduce();
return f;
}
const Fraction operator/ (const Fraction& f1, const Fraction& f2) {
int n3 = f1.numerator * f2.denominator;
int d3 = f1.denominator * f2.numerator;
Fraction f(n3, d3);
f.reduce();
return f;
}
bool operator== (const Fraction& f1, const Fraction& f2) {
int a = f1.numerator * f2.denominator;
int b = f1.denominator * f2.numerator;
return a == b;
}
const Fraction operator- (const Fraction& f1) {
int n = -f1.numerator;
int d = f1.denominator;
if ((n < 0) && (d < 0)) {
-n;
-d;
}
else if (d < 0) {
-n;
-d;
}
Fraction f(n, d);
return f;
}
void Fraction::reduce() {
int g = gcd(abs(numerator), abs(denominator));
numerator /= g;
denominator /= g;
}
ostream& operator<< (ostream& output, const Fraction& f1) {
if (((f1.numerator < 0) || (f1.denominator < 0))
&& !((f1.numerator < 0) && (f1.denominator < 0)))
output << " - ";
output << abs(f1.numerator) << " / " << abs(f1.denominator);
return output;
}
istream& operator>> (istream& input, Fraction& f1) {
int n, d;
char ch;
input >> n >> ch >> d;
if (ch != '/') {
cout << "Fraction format error." << endl;
exit(1);
}
if (0 == d) {
cout << "Illegal value for denominator." << endl;
exit(1);
}
f1.numerator = n;
f1.denominator = d;
return input;
}
int Fraction::gcd(int x, int y) {
if (x % y == 0)
return y;
return gcd(y, x % y);
}
--------------------
#include <iostream>
using namespace std;
#include "fraction.h"
int main()
{
fraction first(1, 2);
fraction second (2,4);
fraction result=first+second;
return 0;
}