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

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

Войти
Регистрация
Восстановить пароль
 
Gorillych
14 / 14 / 1
Регистрация: 04.07.2013
Сообщений: 76
#1

О специализации шаблона: почему код компилируется? - C++

22.07.2013, 17:20. Просмотров 400. Ответов 4
Метки нет (Все метки)

Добрый день.
Вроде бы, по правилам специализации шаблонов, можно только уточнять поведение шаблонного класса, но нельзя изменять его структуру. Однако, приведенный ниже код успешно компилируется и правильно работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
template <typename T>
struct A
{
   //Пустой класс 
};
 
template <>
struct A<float>
{
    static std::function<void()> f;
};
 
std::function<void()> A<float>::f = [](){std::cout<<"float specialized\n";};
 
template <>
struct A<double>
{
    static std::function<void()> f;
};
 
std::function<void()> A<double>::f = [](){std::cout<<"double specialized\n";};
 
int main()
{
    A<float> ob1;
    A<double> ob2;
    ob1.f();
    ob2.f();
}
Использую компилятор gcc 4.7. Как это объяснить и стоит ли так делать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2013, 17:20     О специализации шаблона: почему код компилируется?
Посмотрите здесь:

Ошибка при специализации шаблона - C++
Пишу: template &lt;&gt; struct Test &lt; int&gt; { Test(int x) :x(x) {} int Cout () { cout &lt;&lt; &quot;Bool&quot;; ...

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

Как работает данный код? И почему не компилируется? - C++
Обьясните пожалуйста как работает данный код, и скажите почему он не компилируется? И есть ли способ считать числа еще быстрее? ...

Разобраться почему не компилируется код (использование std::bitset) - C++
У меня не компилируется этот код. Где Ошибка? #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace...

Объяснить почему компилируется этот код (динамические массивы) - C++
Что это =-O int*array = new int; То есть почему компилится? anti-k, пожалуйста, прочитайте правила форума и постарайтесь...

Почему не компилируется код в котором описание класса стоит после main - C++
Изучаю с++ по книге за 21 день. Почему когда я пишу так, то не компилируется: #include &lt;iostream&gt; #include &lt;conio.h&gt; #include...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
1443 / 1172 / 61
Регистрация: 21.04.2012
Сообщений: 2,449
Завершенные тесты: 3
22.07.2013, 17:44     О специализации шаблона: почему код компилируется? #2
Цитата Сообщение от Gorillych Посмотреть сообщение
Вроде бы, по правилам специализации шаблонов, можно только уточнять поведение шаблонного класса, но нельзя изменять его структуру.
Где об этом сказано?
Croessmah
Модератор
Эксперт CЭксперт С++
13052 / 7315 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
22.07.2013, 17:45     О специализации шаблона: почему код компилируется? #3
Цитата Сообщение от Gorillych Посмотреть сообщение
но нельзя изменять его структуру.
хоть весь перелопатьте
Gorillych
14 / 14 / 1
Регистрация: 04.07.2013
Сообщений: 76
22.07.2013, 17:54  [ТС]     О специализации шаблона: почему код компилируется? #4
Croessmah, я только-только осваиваю эту тему по книге Александреску. На 29-й странице написано следующее (цитата): "...Используя лишь шаблоны, невозможно специализировать структуру класса (т.е. его данные-члены). Специализировать можно только функции".
Вот эта формулировка меня сильно смутила - может быть я ее неверно понял. Что она означает?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2014, 22:17     О специализации шаблона: почему код компилируется?
Еще ссылки по теме:

Специализация шаблона для char * (рабочий код, но непонятно почему) - C++
Явное определение специализации – это такое определение, в котором за ключевым словом template следует пара угловых скобок &lt;&gt;, а за ними...

Не компилируется программа (экспорт шаблона) - C++
Что неправильно? Делаю все по книге а эти ошибки непонятно откуда берутся Подчеркивается слово export красной линией. Пробовал убрать...

Почему не компилируется? - C++
Привет, перейду сразу к делу. Вот все говорят, что Visual Studio самая крутая студия, а она даже не может скомпилировать эту простую...

Не компилируется почему-то - C++
Вот код программы, она вроде как бы работает, но все равно выдаются ошибки, помогите пожалуйста их исправить, в c++ я новичок: ...


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

Или воспользуйтесь поиском по форуму:
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
18.09.2014, 22:17     О специализации шаблона: почему код компилируется? #5
Цитата Сообщение от Gorillych Посмотреть сообщение
Вот эта формулировка меня сильно смутила - может быть я ее неверно понял. Что она означает?
В твоем примере ты не специализировал член класса, ты специализировал весь шаблон. А в книге имелось в виду, что недопустима конструкция вида:
C++
1
2
3
4
5
6
7
8
9
10
template <typename T>
struct A
{
    void foo() {}
 
    int a;
};
 
template <>
double A<double>::a; // как бы специализация переменной класса `а` другим типом.
Однако допустимо специализировать отдельно функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <typename T>
struct A
{
    void foo() {}
 
    int a;
};
 
template <>
void A<double>::foo()
{
}
Именно эта разница и имелась в виду.
Yandex
Объявления
18.09.2014, 22:17     О специализации шаблона: почему код компилируется?
Ответ Создать тему
Опции темы

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