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

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

Войти
Регистрация
Восстановить пароль
 
Fox_Yo
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 89
#1

Шаблоны и Макросы С++ - C++

19.11.2014, 23:15. Просмотров 708. Ответов 6
Метки нет (Все метки)

Задание связанное с макросами и шаблонами, ни как не могу решить проблему.

Задание:

Макрос - Квадрат числа
Выражение - Квадрат суммы
Целый параметр - unsigned short
Действительный параметр - double

1. Описания открытой подпрограммы ( макроса ) согласно варианту ( табл.2.10 ) .
2. Описания шаблона, вычисляет значение выражения согласно варианту
( табл.24 ) . При вычислении выражения используется макрос .
3. Описания главной программы , которая состоит из:
- Описания и инициирования переменных целого и действительного типов согласно варианту
( табл.2.10 ) ;
- Использование шаблона с целыми параметрами ;
- Использование шаблона с действительными параметрами .

Код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "stdafx.h"
#define Kvad(x) (x*x)
 
template <typename Shab>
Shab KvadSum(Shab a, Shab b)
{
    return Kvad(a) + Kvad(b);
}
 
void main()
{
    unsigned short a = 3;
    double b = 5;
    KvadSum(a,b);
}
Выбивает ошибку: "error C2782: Shab KvadSum(Shab,Shab): в шаблон параметр "Shab" неоднозначен" и "отсутствуют экземпляры шаблон функции "KvadSum", соответствующие списку аргументов типы аргументов: (unsigned short, double)"
Помогите пожалуйста, очень буду благодарен.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2014, 23:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шаблоны и Макросы С++ (C++):

Шаблоны, макросы, размер массива - C++
Статья http://habrahabr.ru/company/pvs-studio/blog/119815/ Там есть такой код template &lt;typename T, size_t N&gt; char...

«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». - C++
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». Есть ли разница в этих понятиях? Если есть, то в чём? И где (в каких...

Шаблоны. Плохо понимаемые моменты из книги "Шаблоны С++. Справочник разработчика". (Вандевурд, Джосаттис) - C++
Так как изучаю эту книгу, то в некоторых местах возникают вопросы. Чтобы не плодить много тем, корни у которых одни, решил создать эту...

Помогите писать на С++ через шаблоны. Консуле я писал, но надо писать исползуя шаблоны - C++
В одномерном массиве, состоящем из п вещественных элементов, вычислить: 1) количество элементов массива, равных 0; 2) сумму элементов...

макросы - C++
Помогите со встроенными макросами, нигде не могу найти. Дайте ссылку на справочник по встроенным макросам либо можно выложить их здесь. ...

макросы - C++
#include &lt;iostream&gt; using namespace std; #define printarray(x,y)//вывод массива x-имя массива, y-число элементов???? int main() ...

6
rikimaru2013
C++ Game Dev
2443 / 1136 / 240
Регистрация: 30.11.2013
Сообщений: 3,696
19.11.2014, 23:20 #2
C++
1
#define Kvad(x) (x*x)
лучше
C++
1
#define Kvad(x) ((x)*(x))
1
Fox_Yo
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 89
19.11.2014, 23:24  [ТС] #3
rikimaru2013, Все равно не пашет, там дело не в макросе, а в шаблоне. Но все равно спасибо за подсказку.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6521 / 3160 / 311
Регистрация: 04.12.2011
Сообщений: 8,762
Записей в блоге: 5
20.11.2014, 00:06 #4
Fox_Yo, компилятор не уверен хотите ли вы пару целых без знака (сужающее для double) или пару действительных (расширяющее для целого без знака)
можно:
C++
1
2
3
4
cout<<KvadSum(a,a);
cout<<KvadSum(b,b);
cout<<KvadSum((double)a, b);
cout<<KvadSum(a, static_cast<unsigned short>(b));//так лучше)
1
MrGluck
Модератор
Эксперт CЭксперт С++
7510 / 4642 / 700
Регистрация: 29.11.2010
Сообщений: 12,676
20.11.2014, 01:14 #5
По традиции макросы пишут заглавными буквами.

Добавлено через 54 секунды
Вроде по русски написано - не может определить какой тип должен получиться в итоге.
1
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3976 / 2200 / 553
Регистрация: 18.10.2014
Сообщений: 3,814
20.11.2014, 07:16 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Fox_Yo Посмотреть сообщение
Выбивает ошибку
Если вы хотите иметь возможность вызывать ваш шаблон с разными типами аргументов, то надо предоставить шаблону эту свободу

C++
1
2
3
4
5
template <typename T, typename U>
<какой-то тип> KvadSum(T a, U b)
{
  return Kvad(a) + Kvad(b);
}
Но тут сразу возникает вопрос - как правильно указать тип возврата. В С++11 это несложно

C++
1
2
3
4
5
template <typename T, typename U>
auto KvadSum(T a, U b) -> decltype(a + b)
{
  return Kvad(a) + Kvad(b);
}
или

C++
1
2
3
4
5
template <typename T, typename U>
decltype(T(0) + U(0)) KvadSum(T a, U b)
{
  return Kvad(a) + Kvad(b);
}
или

C++
1
2
3
4
5
template <typename T, typename U>
typename std::common_type<T, U>::type KvadSum(T a, U b)
{
  return Kvad(a) + Kvad(b);
}
а вот без С++11 все будет несколько сложнее, но тоже решаемо (придется вручную реализовать аналог 'std::common_type').
1
Fox_Yo
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 89
20.11.2014, 09:35  [ТС] #7
TheCalligrapher, Спасибо всем, особенно вам, помогли.
0
20.11.2014, 09:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2014, 09:35
Привет! Вот еще темы с ответами:

Макросы - C++
Ребята помогите!Надо переделать все пож макросы.Но в литературе как -то всё обрывками написано.непонятно как целиком программу писать! ...

Макросы - C++
Написать макрос находящий большое из 4 чисел в студии с++

Макросы - C++
Здравствуйте, сделал программу, а мне еще сказали нужно сделать её с использованием макросов, знаю что это не долго и всё, не мог бы...

макросы - C++
#define EMPTY 0x00 #define ILLEGAL 0xF0 #define B_PRIVATE 0x01 // 1 бит - наличие #define W_PRIVATE 0x03 ...


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

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

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