Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
#1

Перегруженные знаки в дружественных функциях шаблона класса - C++

23.07.2013, 20:33. Просмотров 385. Ответов 3
Метки нет (Все метки)

Здравствуйте! Не могу найти ошибку, только начал тренироваться с шаблонами. Помогите пожалуйста!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include "stdafx.h"
#include <iostream>
using namespace std;
 
template<class Type>
class fraction
{
private:
    Type numerator;
    Type denominator;
    void reduction();
public:
    void show_frac()
    {
        cout << numerator << "/" << denominator << endl;
    }
    void get_frac()
    {
        cout << "Enter numerator: "; cin >> numerator;
        cout << "Enter denominator: "; cin >> denominator;
    }
    friend fraction<Type>& operator +(fraction<Type>& a, fraction<Type>& b);
    friend fraction<Type>& operator -(fraction<Type>& a, fraction<Type>& b);
    friend fraction<Type>& operator /(fraction<Type>& a, fraction<Type>& b);
    friend fraction<Type>& operator *(fraction<Type>& a, fraction<Type>& b);
};
 
template<class Type>
void fraction<Type>::reduction()
{
    Type bigger, smaller, temp;
    if(numerator >= denominator)
    {bigger = numerator; smaller = denominator;}
    else
    {bigger = denominator; smaller = numerator;}
    while(true)
    {
        temp = bigger % smaller;
        if(temp == 0)
        {temp = smaller; break;}
        else
        {bigger = smaller; smaller = temp;}
    }
    numerator /= temp;
    denominator /= temp;
}
 
template<class Type>
fraction<Type>& operator +(fraction<Type>& a, fraction<Type>& b)
{
    fraction<Type> frac;
    frac.numerator = a.numerator * b.denominator + b.numerator * a.denominator;
    frac.denominator = a.denominator * b.denominator;
    frac.reduction();
    return frac;
}
 
template<class Type>
fraction<Type>& operator -(fraction<Type>& a, fraction<Type>& b)
{
    fraction<Type> frac;
    frac.numerator = a.numerator * b.denominator - b.numerator * a.denominator;
    frac.denominator = a.denominator * b.denominator;
    frac.reduction();
    return frac;
}
 
template<class Type>
fraction<Type>& operator /(fraction<Type>& a, fraction<Type>& b)
{
    fraction<Type> frac;
    frac.numerator = a.numerator * b.denominator;
    frac.denominator = a.denominator * b.numerator;
    frac.reduction();
    return frac;
}
 
template<class Type>
fraction<Type>& operator *(fraction<Type>& a, fraction<Type>& b)
{
    fraction<Type> frac;
    frac.numerator = a.numerator * b.numerator;
    frac.denominator = a.denominator * b.denominator;
    return frac;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    fraction<double> fr1, fr2, fr3;
    char ch = 'y', act;
    while(ch != 'n')
    {
        cout << "Enter first fraction: " << endl; 
        fr1.get_frac();
        cout << "Choose action(+, -, /, *): ";
        cin >> act;
        cout << "Enter second fraction: ";
        fr2.get_frac();
        switch(act)
        {
        case '+':
            fr3 = fr1 + fr2; break;
        case '-':
            fr3 = fr1 - fr2; break;
        case '/':
            fr3 = fr1 / fr2; break;
        case '*':
            fr3 = fr1 * fr2; break;
        default:
            cout << "Wrong action!!!" << endl; system("pause"); return 1;
        }
        cout << "Answer is "; fr3.show_frac();
        cout << "Would you like start again?(y/n): "; cin >> ch;
    }
    system("pause");
    return 0;
}
выдаёт: 1>------ Build started: Project: Lafore_H_14_ex_7_pg_679, Configuration: Debug Win32 ------
1>Lafore_H_14_ex_7_pg_679.obj : error LNK2019: unresolved external symbol "class fraction<double> & __cdecl operator*(class fraction<double> &,class fraction<double> &)" (??D@YAAAV?$fraction@N@@AAV0@0@Z) referenced in function _wmain
1>Lafore_H_14_ex_7_pg_679.obj : error LNK2019: unresolved external symbol "class fraction<double> & __cdecl operator/(class fraction<double> &,class fraction<double> &)" (??K@YAAAV?$fraction@N@@AAV0@0@Z) referenced in function _wmain
1>Lafore_H_14_ex_7_pg_679.obj : error LNK2019: unresolved external symbol "class fraction<double> & __cdecl operator-(class fraction<double> &,class fraction<double> &)" (??G@YAAAV?$fraction@N@@AAV0@0@Z) referenced in function _wmain
1>Lafore_H_14_ex_7_pg_679.obj : error LNK2019: unresolved external symbol "class fraction<double> & __cdecl operator+(class fraction<double> &,class fraction<double> &)" (??H@YAAAV?$fraction@N@@AAV0@0@Z) referenced in function _wmain
1>C:\Users\Aleksei\Documents\Visual Studio 2010\Projects\Lafore_H_14_ex_7_pg_679\Debug\Lafore_H_14_ex_7_pg_679.exe : fatal error LNK1120: 4 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Добавлено через 7 часов 18 минут
Отзовитесь о умные люди!!!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.07.2013, 20:33     Перегруженные знаки в дружественных функциях шаблона класса
Посмотрите здесь:

C++ Реализация шаблона класса
C++ Конструктор шаблона класса
C++ Использование шаблона класса
C++ Использование операторов шаблона класса
C++ Специализация шаблона класса
Const в функциях-членах класса C++
C++ Компилятор путает знаки шаблона и оператор сравнения
Не дать клиету класса вводить числа и знаки C++
C++ Параметры типа класса шаблона
C++ Почему перегруженные операторы ввода/вывода нельзя сделать членами класса?
C++ Реализация шаблона класса char
Оператор noexcept и перегруженные методы класса C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2455 / 1627 / 238
Регистрация: 24.11.2012
Сообщений: 4,003
23.07.2013, 20:47     Перегруженные знаки в дружественных функциях шаблона класса #2
C++
1
2
template<class T>
friend fraction<T> operator +(const fraction<T>& a, const fraction<T>& b);
castaway
Эксперт С++
4876 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,075
Записей в блоге: 10
Завершенные тесты: 1
23.07.2013, 20:49     Перегруженные знаки в дружественных функциях шаблона класса #3
+ забыл перегрузить операцию %
Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
23.07.2013, 21:34  [ТС]     Перегруженные знаки в дружественных функциях шаблона класса #4
0x10, Спасибо большое, теперь всё работает. Для double конечно не подходит... но ничего, в задании было написано целочисленные значения, вот что значит не спать ночью
Yandex
Объявления
23.07.2013, 21:34     Перегруженные знаки в дружественных функциях шаблона класса
Ответ Создать тему
Опции темы

Текущее время: 18:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru