Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 15.07.2013
Сообщений: 14

Шаблонный класс с шаблонным оператором внутри - непонятное поведение

20.04.2015, 17:20. Показов 1072. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал "кукольный" пример, дабы не смущать читателей ненужными деталями.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
template <typename T> struct foo
{
    T x;
    template <typename P> foo & operator = (const foo <P> &other)
    {
            x = other.x + 1;
            return *this;
    }
};
 
int main()
{
    foo <double> a; a.x = 5;
    foo <double> b; b = a; //А если foo <int> b; b = a; то выводит 6 (как и нужно)
    std::cout << b.x << std::endl; // Выводит 5, нужно 6
    return 0;
}
Хочется переопределить оператор присваивания. Как сделать это правильно?
Мой код работает, если P!=T. Нужно, чтобы работал всегда, чтобы выводилось число 6 и в случае одинаковых типов-носителей.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.04.2015, 17:20
Ответы с готовыми решениями:

Счётчик внутри анонимного метода. Непонятное поведение
Здравствуйте. Почему выводит 0, и только если раскомментировать строку, выведет 1? using System.Collections.Generic; using System; ...

Непонятное поведение поведение TIM6 на STM32f4discovery
Вводные данные: SYSCLK=168Мгц; AHB Pressotir=1; APB1 Pressotir=4; TIM6_Pessotir=3; Т.о. частота тактирования на таймере=42Мгц ...

Сделать пользовательский класс QueueWithPriority шаблонным классом
программа работает с определенным типом данных, сказали сделать чтобы можно было работать с любым, а я не совсем понимаю как расставить...

7
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
20.04.2015, 17:22
Pershin, Компилятор оставляет свою перегрузку оператора присваивания, ибо у вас есть только шаблонная. Просто переопределите еще и не шаблонный оператор присваивания и все будет ок.
1
2393 / 1922 / 763
Регистрация: 27.07.2012
Сообщений: 5,564
20.04.2015, 17:24
Цитата Сообщение от Pershin Посмотреть сообщение
Хочется переопределить оператор присваивания. Как сделать это правильно?
Точно так же, как ты это сделал для другого типа:
C++
1
2
3
4
5
6
7
8
9
10
template <typename T> struct foo
{
// ...
    foo & operator = (const foo <T> &other)
    {
        x = other.x + 1;
        return *this;
    }
// ...
};
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
20.04.2015, 17:24
Pershin,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
template <typename T> struct foo
{
    T x;
    foo & operator = (const foo &other)
    {
            x = other.x + 1;
            return *this;
    }
};
 
int main()
{
    foo <double> a; a.x = 5;
    foo <double> b; b = a; //А если foo <int> b; b = a; то выводит 6 (как и нужно)
    std::cout << b.x << std::endl; // Выводит 5, нужно 6
    return 0;
}
Шаблонный оператор присваивания, который ты определил, имеет более низкий приоритет (потому что он шаблонный), чем оператор присваивания по-умолчанию, который сгенерировал компилятор.
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
20.04.2015, 17:29
Добавить:
C++
1
foo&operator=(const foo&other){return operator=<T>(other);}
1
0 / 0 / 0
Регистрация: 15.07.2013
Сообщений: 14
20.04.2015, 21:01  [ТС]
Спасибо, разобрался!

Добавлено через 3 часа 18 минут
Так, ещё вопрос. На ту же тему. Попытался сделать по аналогии с Renji -- не вышло.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
template <typename T> struct foo
{
    T x;
    foo() {}
    template <typename P> foo(const foo<P>& other)
    {
        x = 42;
    }
    foo(const foo& other) : foo<T>(other) {}
};
 
int main()
{
    foo <int> a;
    foo <int> b(a); //Если здесь другой тип, а не int, то всё работает
    std::cout << b.x << std::endl;
    return 0;
}
Ошибка сегментирования.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
20.04.2015, 21:32
Лучший ответ Сообщение было отмечено Pershin как решение

Решение

Цитата Сообщение от Pershin Посмотреть сообщение
Ошибка сегментирования.
Бесконечная рекурсия ибо.
Цитата Сообщение от Pershin Посмотреть сообщение
foo(const foo& other) : foo<T>(other) {}
Здесь у тебя вызывается не шаблонный конструктор, а все тот же, нешаблонный. Имеем рекурсию и вылет. Более того, вменяемый компилятор не должен разрешать такой код. Скорее всего имеет место недоделка в поддержке С++11 в твоем компиляторе.
В С++ нет способа явно указать параметр шаблонного конструктора.
Как вариант, можно обойтись вот таким трюком:
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <typename T>
struct foo
{
    T x;
    foo() {}
    template <typename P>
    foo(const foo<P> & other, void* = 0)
    {
        x = 42;
    }
    foo(const foo & other) : foo(other, 0) {}
};
1
0 / 0 / 0
Регистрация: 15.07.2013
Сообщений: 14
20.04.2015, 22:25  [ТС]
g++ -Wall молчал

Интересная особенность! Хак возьму на вооружение! Хотя иногда будет проще скопировать тело конструктора, раз уже встроенного средства нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.04.2015, 22:25
Помогаю со студенческими работами здесь

Непонятное поведение
Всем привет! В книге &quot;Прата - Язык программирования C++. Лекции и управжения 2011&quot; нашёл вот такой пример: const free_throws...

Непонятное поведение ОС
Здрасте! Купил новый комп, а он загружается через раз (чаще через несколько раз), выключается долго, и один раз не вышел из спячки. ...

Непонятное поведение
Касперский обнаружил немного мусора. После загрузки компьютер работает нормально, но со временем начинает подтормаживать. То ли железоЮ то...

MD5 непонятное поведение
Доброе утро, Помогите разобрать MD5. Есть формула : ss1 = md5(data + password) password - '123123123' data -...

Непонятное поведение ArrayList
У меня есть код, который циклом достаёт данные из базы данных и помещает их в HashMap, а оттуда уже типа HashMap помещает в ArrayList....


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru