Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
61 / 28 / 24
Регистрация: 28.09.2017
Сообщений: 399
1

Перегрузка оператора

23.03.2018, 19:25. Показов 456. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет! Помогите решить проблему. При попытке скомпилировать код, у меня выдает ошибку "ссылка на неразрешенный внешний символ", я понимаю, что что-то не так, но не знаю, что именно. (операторов много, но я приведу только operator+)

Вот объявление:
C++
1
friend Vec2 operator+   (const Vec2&, const T);
Реализация:
C++
1
2
3
4
template <typename T>
inline Vec2<T> operator+(const Vec2<T> &MyVec, const T Operand) {
    return Vec2<T>(MyVec.x + Operand, MyVec.y + Operand);
}
Проблема есть, когда объявлено ключевое слово friend, но оно нужно, потому что я не хочу видеть миллион операторов при выборе методов класса.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.03.2018, 19:25
Ответы с готовыми решениями:

Перегрузка оператора
#include &lt;iostream&gt; class Node { public: char *s; int length; Node * next; public:...

Перегрузка оператора ==
Я уже встречала подобный вопрос на этом форуме, но у меня всё равно что-то не получается Вот...

Перегрузка оператора[]
Пример взят из книги Лафоре, тема перегрузка операций. Выдает ошибки: 1.Требуется идентификатор....

Перегрузка оператора +
Всем привет, проблема на этот раз такая. Для того, чтобы выучить классы, я пишу некое подобие...

10
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
23.03.2018, 20:18 2
Зачем этот friend?
0
61 / 28 / 24
Регистрация: 28.09.2017
Сообщений: 399
23.03.2018, 20:32  [ТС] 3
nmcf, в конце я написал.
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
23.03.2018, 20:36 4
Не ясно, что ты имел в виду.
0
61 / 28 / 24
Регистрация: 28.09.2017
Сообщений: 399
23.03.2018, 21:21  [ТС] 5
nmcf, просто скажите мне, если знаете, можно ли использовать "friend" с перегруженными операторами? Потому что без "friend" все отлично.

Добавлено через 37 минут
Абсолютно не понимаю, откопал такой фрагмент кода:

Объявление (как у меня!)
C++
1
friend MinMax operator+(const MinMax &m1, const MinMax &m2);
Реализация (опять же как у меня!):
C++
1
2
3
4
5
6
7
8
9
10
MinMax operator+(const MinMax &m1, const MinMax &m2)
{
    // Get the minimum value seen in m1 and m2
    int min = m1.m_min < m2.m_min ? m1.m_min : m2.m_min;
 
    // Get the maximum value seen in m1 and m2
    int max = m1.m_max > m2.m_max ? m1.m_max : m2.m_max;
 
    return MinMax(min, max);
}
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
23.03.2018, 21:40 6
Можно. У тебя из-за шаблона ошибка, наверное. Или в проекте что-то не верно.
0
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
23.03.2018, 21:50 7
Цитата Сообщение от pavel2210057 Посмотреть сообщение
Абсолютно не понимаю, откопал такой фрагмент кода:
Зачем делать перегруженный оператор встроенным (inline)?
friend используется для обращения внутри метода к приватным/защищенным полям класса.
C++
1
2
3
4
template <typename T>
inline Vec2<T> operator+(const Vec2<T> &MyVec, const T Operand) {
    return Vec2<T>(MyVec.x + Operand, MyVec.y + Operand);
}
В return у вас какая-то дичь. Зачем вообще делать так мудрено?

C++
1
2
3
4
5
template <typename T>
void Vec2<T>::operator+(const T Operand) {
    this->x += Operand; 
    this->y += Operand;
}
Используется:
C++
1
2
Vec2 x;
x + 5;
0
61 / 28 / 24
Регистрация: 28.09.2017
Сообщений: 399
23.03.2018, 22:35  [ТС] 8
SuperKir, если поставить тип void, то выбивает ошибку о том, что нельзя приравнять к типу void. Для теста использую вот это:

C++
1
2
3
4
5
    Vec2f Float_Vec_1, Float_Vec_2(30, 50);
 
    Float_Vec_1 = Float_Vec_2 + 5;
 
    std::cout << Float_Vec_1.getX() << " " << Float_Vec_1.getY() << "\n";
(Vec2f = typedef Vec2<float>)
0
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
24.03.2018, 00:15 9
Цитата Сообщение от pavel2210057 Посмотреть сообщение
Float_Vec_1 = Float_Vec_2 + 5;
Для подобного вызова:

C++
1
2
3
4
5
6
template <typename T>
Vec2<T>& Vec2<T>::operator+(const T Operand) {
    this->x += Operand; 
    this->y += Operand;
    return this;
}
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
24.03.2018, 06:53 10
И как ему это поможет? this возвращает только =.
0
61 / 28 / 24
Регистрация: 28.09.2017
Сообщений: 399
24.03.2018, 08:29  [ТС] 11
Я вынес операторы за пределы класса, теперь все круто работает.
0
24.03.2018, 08:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.03.2018, 08:29
Помогаю со студенческими работами здесь

Перегрузка оператора '='
Не давно стал изучать С++ и дошёл до перегрузок операторов, и с книги написал пример, и не могу в...

Перегрузка оператора ++
Что делает оператор ++ при его перегрузке?

Перегрузка оператора
Привет, форумчане. Есть простой класс, в котором перегружается оператор '==' : #ifndef POINT_H...

Перегрузка оператора =
помогите создать перегруженный оператор = в классе Х, который будет копировать содержание строки...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru