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

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

Войти
Регистрация
Восстановить пароль
 
D.E.S.P.E.R.O.
9 / 9 / 0
Регистрация: 12.03.2009
Сообщений: 110
Завершенные тесты: 1
#1

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

26.10.2012, 16:38. Просмотров 877. Ответов 8
Метки нет (Все метки)

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

Инстанцирование шаблона - C++
Есть шаблонная очередь с использованием vector Как инстанцировать для своего класса, представляющего строку, изготовленную из...

Инстанцирование шаблона во время выполнения - C++
Добрый вечер! Компилятор требует константное выражение передаваемое в шаблон, как это можно обойти? мб с помощью каких то заклинаний над...

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

Инстанцирование шаблонного класса - C++
Уважаемые форумчане! Помогите в не сложном, как я полагаю, для Вас вопросе. Имеется шаблонный класс-контейнер оформленный в виде модуля...

Определение метода-шаблона за пределами шаблона класса - C++
День добрый! Разбираюсь в шаблонах, решил копнуть поглубже. Вот пример: template &lt;typename T1&gt; class K // шаблон класса { public:...

Что такое инстанцирование? - C++
class A { ... }; A a; // Это уже инстанцирование A?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
NoMasters
Псевдослучайный
1754 / 1097 / 72
Регистрация: 13.09.2011
Сообщений: 3,134
26.10.2012, 16:43 #2
На правах капитана: b вообще не массив, он указатель.
0
D.E.S.P.E.R.O.
9 / 9 / 0
Регистрация: 12.03.2009
Сообщений: 110
Завершенные тесты: 1
26.10.2012, 16:55  [ТС] #3
Но а при передаче в функцию вроде тоже должен трактоваться как указатель?
0
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
26.10.2012, 16:57 #4
Цитата Сообщение от D.E.S.P.E.R.O. Посмотреть сообщение
Я подозреваю, что динамическая память под массив будет выделена на этапе выполнения, а инстанцирование шаблона происходит на этапе компиляции.
В яблочко.
1
D.E.S.P.E.R.O.
9 / 9 / 0
Регистрация: 12.03.2009
Сообщений: 110
Завершенные тесты: 1
26.10.2012, 17:06  [ТС] #5
То есть ругаеться компилятор, по сути, из-за size, которого еще не существует?
0
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
26.10.2012, 17:11 #6
Цитата Сообщение от D.E.S.P.E.R.O. Посмотреть сообщение
То есть ругаеться компилятор, по сути, из-за size, которого еще не существует?
Грубо говоря, да. Компилятор не может определить размер массива, поскольку это вообще не массив.
1
D.E.S.P.E.R.O.
9 / 9 / 0
Регистрация: 12.03.2009
Сообщений: 110
Завершенные тесты: 1
26.10.2012, 17:14  [ТС] #7
Потому что санет массивом только после выделения памяти, то есть на этапе выполнения. soon, большое спасиба за разъяснение.
0
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
26.10.2012, 17:18 #8
D.E.S.P.E.R.O., даже тогда он не станет массивом. Он будет указывать на выделенный кусок памяти, размером size * sizeof(T).
1
D.E.S.P.E.R.O.
9 / 9 / 0
Регистрация: 12.03.2009
Сообщений: 110
Завершенные тесты: 1
26.10.2012, 17:23  [ТС] #9
soon, еще раз большое спасибо. Теперь все предельно ясно!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2012, 17:23
Привет! Вот еще темы с ответами:

Можно ли инстанцирование класса прописать в самом классе? - C++
Можно ли инстанцирование класса прописать в самом классе?

Ошибка шаблона - C++
Здравствуйте. Для шаблонного класса надо определить, что не использован тип void: template&lt;typename Type&gt; struct IsNoVoid { ...

Специализация шаблона - C++
Здравствуйте! Задача: Создайте шаблонную функцию maxn(), которая принимает в качестве аргумента массив элементов типа Т и целое...

Друг шаблона - C++
Всем доброго дня !! Подскажите пожалуйста в чем может быть проблема ? когда блокирую 64 строку - то все нормально ((( при...


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

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

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