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

Несовместимые типы условной операции, макрос и шаблон - C++

Восстановить пароль Регистрация
 
Agent Smith
40 / 40 / 9
Регистрация: 24.11.2012
Сообщений: 200
16.05.2014, 19:30     Несовместимые типы условной операции, макрос и шаблон #1
был такой класс
C++
1
2
class Matrix{
//код }
такой макрос
C++
1
#define CURR(x) (somevar==1?(x##1):(x##2))
и 2 переменных Matrix M1,M2;
теперь класс стал шаблонным
C++
1
2
3
template<typename T>
class Matrix{
//код}
и параметризуется short и double.
А MSVS2010 ругается на такие применения макроса:
C++
1
CURR(M)
, говоря что типы операндов несовместимы(IntelliSense) и нет преобразования Matrix<T> в Matrix<T>(компилятор). Я в принципе понимаю почему, но не могу придумать, как мне с малейшими затратами поправить код(желательно макрос, а то он очень во многих местах задействован)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2014, 19:30     Несовместимые типы условной операции, макрос и шаблон
Посмотрите здесь:

Оператор условной передачи C++
C++ Необходимо разобраться с директивами условной компиляции
Если макрос на VBA переписать на С++, то макрос станет работать быстрее? C++
C++ IntelliSense: несовместимые типы операндов ("char" и "const char *")
Шаблон принимает два типовых параметра. Если параметры - одни и те же типы, вернуть true C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
16.05.2014, 19:52     Несовместимые типы условной операции, макрос и шаблон #2
Я так понимаю, в разных ветках тернарного оператора возвращаются разные типы? Это не будет работать.
А макрос такой - жесть, конечно. И если он широко используется в коде, то это повод задуматься.
Agent Smith
40 / 40 / 9
Регистрация: 24.11.2012
Сообщений: 200
16.05.2014, 20:03  [ТС]     Несовместимые типы условной операции, макрос и шаблон #3
Да я понимаю. у меня просто в программе было 2 объекта(M1 и M2) одного типа Matrix и в интерфейсе надо было с обоими делать одинаковые действия. Поэтому я написал 1 вариант обработчиков контролов, а информацию о конкретном контроле который вызвал обработчик передавал ч/з переменную somevar. И это работало, пока не понадобилось сделать класс шаблонным и показать работу при параметризации разными типами. Ну и сломалась у меня моя "гениальная" архитектура. А как такое решается в реальных проектах, когда есть несколько совершенно одинаковых форм, но они должны работать с соответствующими им объектами? Не поверю что для каждой пишутся свои обработчики, работающие с соответствующими им объектами.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
16.05.2014, 20:07     Несовместимые типы условной операции, макрос и шаблон #4
Я по словесному описанию плохо представляю что там происходит.
Как и с трудом могу представить логику, по которой в зависимости от некоторого условия возвращаются разные типы.
От балды могу предложить написать две перегруженные функции - одна принимает Matrix<T1>, вторая Matrix<T2> и вызывать одну из них... Но это кривота, да. Изначально логика была на костылях.
Agent Smith
40 / 40 / 9
Регистрация: 24.11.2012
Сообщений: 200
16.05.2014, 20:16  [ТС]     Несовместимые типы условной операции, макрос и шаблон #5
Есть 2 матрицы. В программе нужно было заполнять эти матрицы, смотреть значения в ячейках, сравнивать матрицы на равенство, копировать одну в другую. Как видим, логика операций заполнение/просмотр одинакова для обоих, в коде только нужно использовать вторую матрицу и окно ввода из второй формы если нажата кнопка setValue на второй форме. если такая кнопка нажата на первой форме, то нужно использовать первую матрицу и окно ввода с первой формы. Не писать же отдельные обработчики для кнопок setValue1 и setValue2, в которых весь код будет абсолютно одинаков, за исключением имен объектов.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
16.05.2014, 20:30     Несовместимые типы условной операции, макрос и шаблон #6
Цитата Сообщение от Agent Smith Посмотреть сообщение
Не писать же отдельные обработчики для кнопок setValue1 и setValue2, в которых весь код будет абсолютно одинаков, за исключением имен объектов.
Вот так вот делается:
C++
1
2
3
4
5
6
7
void button1_handle(MouseEvent e) {
    process(m1);
}
 
void button2_handle(MouseEvent e) {
    process(m2);
}
В process делаешь что тебе нужно а в обработчике просто подсовываешь нужный объект.

Добавлено через 3 минуты
Цитата Сообщение от Agent Smith Посмотреть сообщение
#define CURR(x) (somevar==1?(x##1)x##2))
Запомни раз и на всю жизнь: дефайны используются только для изменения поведения программы и надо они только если ты хочешь писать свой фреймворк аля Qt.

Добавлено через 3 минуты

Не по теме:

Agent Smith, Классная подпись

Agent Smith
40 / 40 / 9
Регистрация: 24.11.2012
Сообщений: 200
16.05.2014, 20:42  [ТС]     Несовместимые типы условной операции, макрос и шаблон #7
Так конечно гораздо лучше, но что если у меня от нажатой кнопки зависит не только m1/m2, но еще n-e количество контролов, в которых будет выводиться результат этого нажатия. Мне их все пробрасывать в process? или есть какое-то более красивое решение(может паттерн какой или нужно вводить еще один уровень абстракции(не уверен что корректно употребил термин))?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2014, 21:12     Несовместимые типы условной операции, макрос и шаблон
Еще ссылки по теме:

Записать три варианта вычисления условной функции C++
ошибка: несовместимые типы операндов ("int *" и "int") C++
Используя директивы условной компиляции разработать приложение, переводящие дюймы в сантиметры и наоборот C++

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

Или воспользуйтесь поиском по форуму:
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
16.05.2014, 21:12     Несовместимые типы условной операции, макрос и шаблон #8
Agent Smith, не можно а нужно, нужно уходить подальше от дефайнов. Благо есть море паттернов и ООП позволят извернуться нехило так. Все зависит от конкретной ситуации.
Yandex
Объявления
16.05.2014, 21:12     Несовместимые типы условной операции, макрос и шаблон
Ответ Создать тему

Метки
?:, макросы, шаблоны
Опции темы

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