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

Инстанцирование шаблона - C++

Восстановить пароль Регистрация
 
D.E.S.P.E.R.O.
 Аватар для D.E.S.P.E.R.O.
9 / 9 / 0
Регистрация: 12.03.2009
Сообщений: 110
Завершенные тесты: 1
26.10.2012, 16:38     Инстанцирование шаблона #1
Существует шаблон следующего вида:
C++
1
2
3
4
5
template<class T, int size>
void foo(T (&array)[size])
{
    cout << size << endl;
}
И следующий пример его использования:
C++
1
2
3
4
5
6
7
8
9
10
11
int main(int argc, char *argv[])
{
    int a[] = {0, 1, 2};
    int *b  = new int[3];
    
    foo(a);
    foo(b);
 
    system("PAUSE");
    return 0;
}
Почему для массива а все происходит гладко, а для массива b компилятор выдает вот такую ошибку:
error C2784: 'void foo(T (&)[size])' : could not deduce template argument for 'T (&)[size]' from 'int *'
Я подозреваю, что динамическая память под массив будет выделена на этапе выполнения, а инстанцирование шаблона происходит на этапе компиляции. Но хотелось бы услышать более авторитетное мнение... Заранее спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NoMasters
Псевдослучайный
1740 / 1083 / 70
Регистрация: 13.09.2011
Сообщений: 3,102
26.10.2012, 16:43     Инстанцирование шаблона #2
На правах капитана: b вообще не массив, он указатель.
D.E.S.P.E.R.O.
 Аватар для D.E.S.P.E.R.O.
9 / 9 / 0
Регистрация: 12.03.2009
Сообщений: 110
Завершенные тесты: 1
26.10.2012, 16:55  [ТС]     Инстанцирование шаблона #3
Но а при передаче в функцию вроде тоже должен трактоваться как указатель?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
26.10.2012, 16:57     Инстанцирование шаблона #4
Цитата Сообщение от D.E.S.P.E.R.O. Посмотреть сообщение
Я подозреваю, что динамическая память под массив будет выделена на этапе выполнения, а инстанцирование шаблона происходит на этапе компиляции.
В яблочко.
D.E.S.P.E.R.O.
 Аватар для D.E.S.P.E.R.O.
9 / 9 / 0
Регистрация: 12.03.2009
Сообщений: 110
Завершенные тесты: 1
26.10.2012, 17:06  [ТС]     Инстанцирование шаблона #5
То есть ругаеться компилятор, по сути, из-за size, которого еще не существует?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
26.10.2012, 17:11     Инстанцирование шаблона #6
Цитата Сообщение от D.E.S.P.E.R.O. Посмотреть сообщение
То есть ругаеться компилятор, по сути, из-за size, которого еще не существует?
Грубо говоря, да. Компилятор не может определить размер массива, поскольку это вообще не массив.
D.E.S.P.E.R.O.
 Аватар для D.E.S.P.E.R.O.
9 / 9 / 0
Регистрация: 12.03.2009
Сообщений: 110
Завершенные тесты: 1
26.10.2012, 17:14  [ТС]     Инстанцирование шаблона #7
Потому что санет массивом только после выделения памяти, то есть на этапе выполнения. soon, большое спасиба за разъяснение.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
26.10.2012, 17:18     Инстанцирование шаблона #8
D.E.S.P.E.R.O., даже тогда он не станет массивом. Он будет указывать на выделенный кусок памяти, размером size * sizeof(T).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2012, 17:23     Инстанцирование шаблона
Еще ссылки по теме:

Специализация шаблона C++
C++ Параметры шаблона
Параметры шаблона C++
C++ Специализация шаблона
C++ Инстанцирование шаблона во время выполнения

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

Или воспользуйтесь поиском по форуму:
D.E.S.P.E.R.O.
 Аватар для D.E.S.P.E.R.O.
9 / 9 / 0
Регистрация: 12.03.2009
Сообщений: 110
Завершенные тесты: 1
26.10.2012, 17:23  [ТС]     Инстанцирование шаблона #9
soon, еще раз большое спасибо. Теперь все предельно ясно!
Yandex
Объявления
26.10.2012, 17:23     Инстанцирование шаблона
Ответ Создать тему
Опции темы

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