Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Agent Smith
40 / 40 / 9
Регистрация: 24.11.2012
Сообщений: 200
#1

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

16.05.2014, 19:30. Просмотров 310. Ответов 7

был такой класс
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>(компилятор). Я в принципе понимаю почему, но не могу придумать, как мне с малейшими затратами поправить код(желательно макрос, а то он очень во многих местах задействован)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2014, 19:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Несовместимые типы условной операции, макрос и шаблон (C++):

Несовместимые типы операндов int и char - C++
Всем здравия! Ребят я запарился уже помогите пожалуйста! Учусь в универе необходимо создать БД в с++. Выдает ошибку при вводе &quot;даты...

Применение условной операции - C++
Вычислить значение функции F при вещественных a,b,c,x, вводимых с клавиатуры. После выполнения программы выводит только 0 или 1, не...

Поведение тернарной условной операции - C++
Имеется код: #include &lt;iostream&gt; using namespace std; int main() { int x, y; cout &lt;&lt;...

Несовместимые типы операндов ("HKL" и "int") - C++
GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL)) == 409) Выдает ошибку &quot;несовместимые типы операндов (&quot;HKL&quot; и...

IntelliSense: несовместимые типы операндов ("char" и "const char *") - C++
привет всем! при таком коде: void main() { ifstream fin; ofstream fout; fin.open(&quot;input.txt&quot;); ...

Ошибка: несовместимые типы операндов ("int *" и "int") - C++
Дан список не менее 8 рабочих, ввести фамилию, кол. лет, стаж работы, сколько до пенсии. Вывести кому осталось меньше 15 лет до пенсии. ...

7
0x10
2479 / 1654 / 248
Регистрация: 24.11.2012
Сообщений: 4,097
16.05.2014, 19:52 #2
Я так понимаю, в разных ветках тернарного оператора возвращаются разные типы? Это не будет работать.
А макрос такой - жесть, конечно. И если он широко используется в коде, то это повод задуматься.
0
Agent Smith
40 / 40 / 9
Регистрация: 24.11.2012
Сообщений: 200
16.05.2014, 20:03  [ТС] #3
Да я понимаю. у меня просто в программе было 2 объекта(M1 и M2) одного типа Matrix и в интерфейсе надо было с обоими делать одинаковые действия. Поэтому я написал 1 вариант обработчиков контролов, а информацию о конкретном контроле который вызвал обработчик передавал ч/з переменную somevar. И это работало, пока не понадобилось сделать класс шаблонным и показать работу при параметризации разными типами. Ну и сломалась у меня моя "гениальная" архитектура. А как такое решается в реальных проектах, когда есть несколько совершенно одинаковых форм, но они должны работать с соответствующими им объектами? Не поверю что для каждой пишутся свои обработчики, работающие с соответствующими им объектами.
0
0x10
2479 / 1654 / 248
Регистрация: 24.11.2012
Сообщений: 4,097
16.05.2014, 20:07 #4
Я по словесному описанию плохо представляю что там происходит.
Как и с трудом могу представить логику, по которой в зависимости от некоторого условия возвращаются разные типы.
От балды могу предложить написать две перегруженные функции - одна принимает Matrix<T1>, вторая Matrix<T2> и вызывать одну из них... Но это кривота, да. Изначально логика была на костылях.
0
Agent Smith
40 / 40 / 9
Регистрация: 24.11.2012
Сообщений: 200
16.05.2014, 20:16  [ТС] #5
Есть 2 матрицы. В программе нужно было заполнять эти матрицы, смотреть значения в ячейках, сравнивать матрицы на равенство, копировать одну в другую. Как видим, логика операций заполнение/просмотр одинакова для обоих, в коде только нужно использовать вторую матрицу и окно ввода из второй формы если нажата кнопка setValue на второй форме. если такая кнопка нажата на первой форме, то нужно использовать первую матрицу и окно ввода с первой формы. Не писать же отдельные обработчики для кнопок setValue1 и setValue2, в которых весь код будет абсолютно одинаков, за исключением имен объектов.
0
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
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, Классная подпись

1
Agent Smith
40 / 40 / 9
Регистрация: 24.11.2012
Сообщений: 200
16.05.2014, 20:42  [ТС] #7
Так конечно гораздо лучше, но что если у меня от нажатой кнопки зависит не только m1/m2, но еще n-e количество контролов, в которых будет выводиться результат этого нажатия. Мне их все пробрасывать в process? или есть какое-то более красивое решение(может паттерн какой или нужно вводить еще один уровень абстракции(не уверен что корректно употребил термин))?
0
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
16.05.2014, 21:12 #8
Agent Smith, не можно а нужно, нужно уходить подальше от дефайнов. Благо есть море паттернов и ООП позволят извернуться нехило так. Все зависит от конкретной ситуации.
0
16.05.2014, 21:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2014, 21:12
Привет! Вот еще темы с ответами:

Несовместимые типы операндов "char" и "const char*" - C++
В чем проблема?

Шаблон принимает два типовых параметра. Если параметры - одни и те же типы, вернуть true - C++
Помогите с задачей. Реализовать простой шаблон SameType. Этот шаблон не содержит никаких методов, а только одно статическое константное...

Оператор условной передачи - C++
1.описать оператор условной передачи в алгоритмическом языке турбо паскаль и в алгоритмическом языке си++.привести пример

Объявление переменных в условной конструкции C++ - C++
Добрый день, возник вот такой вопрос: объявляю переменную внутри условной конструкции. В случае, если условие выполняется, вроде бы всё...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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