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

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

Войти
Регистрация
Восстановить пароль
 
 
PointsEqual
ниначмуроФ
835 / 519 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
#1

шаблон функции - C++

13.07.2010, 18:35. Просмотров 873. Ответов 17
Метки нет (Все метки)

Здрасти. Как правильно написать шаблон ,например, этой функции?

C++
1
2
3
4
5
6
int **newmatrix(int row, int col){
    int **matrix=new int*[row];
    for (int i=0; i<row; ++i)
        matrix[i]=new int[col];
    return matrix;
}
я сделал так:
C++
1
2
3
4
5
6
7
template <typename T>
T **newmatrix(int row, int col){
    T **matrix=new T*[row];
    for (int i=0; i<row; ++i)
        matrix[i]=new T[col];
    return matrix;
}
компилятор наругался на эту строку
C++
1
T **newmatrix(int row, int col){
... заменил ее на
C++
1
T **newmatrix(T row, T col){
и все заработало.
но если у меня будет матрица типа float, то row и col тоже будут float, а это же неверно

Как сделать правильно?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.07.2010, 18:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос шаблон функции (C++):

Используя перегруженные функции и шаблон функции удалить из массива элемент по индексу - C++
Стоит следующая задача: Используя перегруженные функции и шаблон функции удалить из массива элемент по индексу. Функцию написал, но я...

шаблон функции. Задачей функции является округление вышеуказанного вещественного числа с заданной точностью - C++
Написать функцию, которая принимает в качестве параметров вещественное число и количество знаков после десятичной точки, которые должны...

Ошибка в шаблоне функции: "Отсутствуют экземпляры шаблон функции, соответствующие списку аргументов" - C++
#include &lt;iostream&gt; #include &lt;iterator&gt; #include &lt;map&gt; #include &lt;Windows.h&gt; #include &lt;functional&gt; #include &lt;string&gt; #include...

Перегруженные функции и шаблон функции - C++
Указания: 1. Перегрузить функции для массивов типа char, int, и double. 2. Инстанцировать шаблон функции для типов char, int, и double....

Шаблон функции - C++
Привет, есть функции cinFloat() и cinInt() в коде, их я бы хотел заменить на шаблон функции(потому что они одинаковые, просто работают с...

Шаблон функции - C++
Всем привет. Помогите пожалуйста решить вот такую задачку. Написать шаблон функции для поиска среднего арифметического значений...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
13.07.2010, 19:06 #2
Указывай специализацию шаблона при вызове функции:
C++
1
double** matrix=newmatrix<double>(4, 6);
Добавлено через 3 минуты
Сопоставление между вызовом и объявлением шаблона осуществляется по аргументам функции, а не по возвращаемому значению, поэтому в данном случае специализация шаблона необходима. А в следующем примере она необязательна:
C++
1
2
3
4
5
6
7
8
template<class T>
T foo(T a, T b)
{
    //...
}
//...
int x=4, y=5;
int z=foo(x, y);
Добавлено через 3 минуты
Однако, к аргументам функций, тип которых определяется параметром шаблона, не применяются стандартные преобразования. Т.о., если переменные x и y в приведенном примере будут разных типов, то опять же нужно будет явно указывать специализацию шаблона при вызове функции, либо провести явное преобразование одного аргумента к типу другого.
1
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
14.07.2010, 00:40 #3
Nameless One, будут разных типов, то опять же нужно будет явно указывать специализацию шаблона при вызове функции, либо провести явное преобразование одного аргумента к типу другого.
А написать

C++
1
2
template<class T1, class T2>
T2 foo(T1 a, T2 b)
Не подойдет?
1
PointsEqual
ниначмуроФ
835 / 519 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
14.07.2010, 00:46  [ТС] #4
Цитата Сообщение от Lavroff Посмотреть сообщение
Не подойдет?
я так пробовал, - не работает
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
14.07.2010, 00:47 #5
PointsEqual, Странно. Для разных типов данных должно бы... Например int и float...
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
14.07.2010, 00:56 #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <typename T> 
T ** create(size_t Rows, size_t Cols)
{
    T ** m = 0;
    return m;
}
 
int main() 
{
    int n = 5, m = 5;
    float ** matrix = create<float>(n, m);
}
Ошибок не замечено
0
PointsEqual
ниначмуроФ
835 / 519 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
14.07.2010, 01:09  [ТС] #7
Цитата Сообщение от fasked Посмотреть сообщение
float ** matrix = create<float>(n, m);
ошибок нет, да.
но вот
C++
1
create<float>(n, m);
значит что n и m - вещественные? хотя объявлены как целые.
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
14.07.2010, 01:12 #8
Цитата Сообщение от PointsEqual Посмотреть сообщение
значит что n и m - вещественные? хотя объявлены как целые.
Нет, для них явно указан тип size_t, типом float будут только те переменные, которые созданы как T
1
PointsEqual
ниначмуроФ
835 / 519 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
14.07.2010, 01:15  [ТС] #9
fasked, спасибо, дошло.

Еще на счет size_t- его где следует применять?
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
14.07.2010, 01:18 #10
Цитата Сообщение от PointsEqual Посмотреть сообщение
Еще на счет size_t- его где следует применять?
size_t - это синоним unsigned int. название говорящее, применяется обычно для обозначения длин, размеров, и всего подобного, что не может быть отрицательным по определению. функция strlen возвращает значение size_t.
0
PointsEqual
ниначмуроФ
835 / 519 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
14.07.2010, 01:24  [ТС] #11
и если я буду тип счетчика делать size_t , то это корректно будит.?
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
14.07.2010, 01:27 #12
корректно, но без фанатизма, есть ведь просто unsigned
1
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
14.07.2010, 01:28 #13
Цитата Сообщение от PointsEqual Посмотреть сообщение
и если я буду тип счетчика делать size_t , то это корректно будит.?
предупреждения задолбали? xD
да, конечно, ничего страшного, ведь счетчик у тебя тоже не может принять отрицательных значений в данном случае. вообще корректно хотя бы потому что в int не влезет такое большое число как в size_t и счетчик должен быть такого же типа или больше
1
PointsEqual
ниначмуроФ
835 / 519 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
14.07.2010, 01:30  [ТС] #14
Цитата Сообщение от fasked Посмотреть сообщение
предупреждения задолбали? xD
угу(

все, спасибо большое
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
14.07.2010, 01:33 #15
но все таки лучше последовать совету alex_x_x и для счетчика написать не size_t, а unsigned int.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2010, 01:33
Привет! Вот еще темы с ответами:

Шаблон функции - C++
Объясните в чем ошибка) Задание: 2. Примером удачного применения функции шаблона есть функция find (), которая ищет элемент object в...

шаблон функции - C++
подсчитать среднее арифметическое элементов расположенных выше главной диагонали. Непойму где ошибка. #include&lt;iostream&gt; using...

Шаблон функции - C++
Всем доброй ночи. Помогите, пожалуйста, написать шаблон функции count() для подсчета числа появлений некоторого значения в массиве. В...

Шаблон функции - C++
Не понимаю в чем проблема, пытаюсь реализовать шаблон функции которая возвращает указатель на указанное значение из заданого интервала ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.07.2010, 01:33
Ответ Создать тему
Опции темы

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