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

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

Восстановить пароль Регистрация
 
Fox_Yo
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 86
19.11.2014, 23:15     Шаблоны и Макросы С++ #1
Задание связанное с макросами и шаблонами, ни как не могу решить проблему.

Задание:

Макрос - Квадрат числа
Выражение - Квадрат суммы
Целый параметр - 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)"
Помогите пожалуйста, очень буду благодарен.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2014, 23:15     Шаблоны и Макросы С++
Посмотрите здесь:

«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». C++
Макросы C++
макросы C++
C++ Макросы
Макросы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2135 / 968 / 223
Регистрация: 30.11.2013
Сообщений: 3,239
19.11.2014, 23:20     Шаблоны и Макросы С++ #2
C++
1
#define Kvad(x) (x*x)
лучше
C++
1
#define Kvad(x) ((x)*(x))
Fox_Yo
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 86
19.11.2014, 23:24  [ТС]     Шаблоны и Макросы С++ #3
rikimaru2013, Все равно не пашет, там дело не в макросе, а в шаблоне. Но все равно спасибо за подсказку.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 283
Регистрация: 04.12.2011
Сообщений: 7,710
Записей в блоге: 3
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));//так лучше)
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4923 / 2666 / 243
Регистрация: 29.11.2010
Сообщений: 7,420
20.11.2014, 01:14     Шаблоны и Макросы С++ #5
По традиции макросы пишут заглавными буквами.

Добавлено через 54 секунды
Вроде по русски написано - не может определить какой тип должен получиться в итоге.
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2903 / 1439 / 397
Регистрация: 18.10.2014
Сообщений: 2,653
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').
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2014, 09:35     Шаблоны и Макросы С++
Еще ссылки по теме:

Помогите писать на С++ через шаблоны. Консуле я писал, но надо писать исползуя шаблоны C++
C++ макросы
C++ Шаблоны, макросы, размер массива

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

Или воспользуйтесь поиском по форуму:
Fox_Yo
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 86
20.11.2014, 09:35  [ТС]     Шаблоны и Макросы С++ #7
TheCalligrapher, Спасибо всем, особенно вам, помогли.
Yandex
Объявления
20.11.2014, 09:35     Шаблоны и Макросы С++
Ответ Создать тему
Опции темы

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