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

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

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

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

22.07.2013, 17:20. Просмотров 394. Ответов 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++ Не компилируется почему-то
Почему не компилируется код C++
C++ почему не компилируется ?
Не компилируется программа (экспорт шаблона) C++
Почему не компилируется? C++
Специализация шаблона для char * (рабочий код, но непонятно почему) C++
C++ Ошибка при специализации шаблона
Почему не компилируется код в котором описание класса стоит после main C++
C++ Разобраться почему не компилируется код (использование std::bitset)
Почему не компилируется C++
C++ Как работает данный код? И почему не компилируется?
C++ Объяснить почему компилируется этот код (динамические массивы)

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
1253 / 1136 / 54
Регистрация: 21.04.2012
Сообщений: 2,359
Завершенные тесты: 3
22.07.2013, 17:44     О специализации шаблона: почему код компилируется? #2
Цитата Сообщение от Gorillych Посмотреть сообщение
Вроде бы, по правилам специализации шаблонов, можно только уточнять поведение шаблонного класса, но нельзя изменять его структуру.
Где об этом сказано?
Croessmah
Модератор
Эксперт CЭксперт С++
12728 / 7188 / 802
Регистрация: 27.09.2012
Сообщений: 17,729
Записей в блоге: 2
Завершенные тесты: 1
22.07.2013, 17:45     О специализации шаблона: почему код компилируется? #3
Цитата Сообщение от Gorillych Посмотреть сообщение
но нельзя изменять его структуру.
хоть весь перелопатьте
Gorillych
14 / 14 / 1
Регистрация: 04.07.2013
Сообщений: 76
22.07.2013, 17:54  [ТС]     О специализации шаблона: почему код компилируется? #4
Croessmah, я только-только осваиваю эту тему по книге Александреску. На 29-й странице написано следующее (цитата): "...Используя лишь шаблоны, невозможно специализировать структуру класса (т.е. его данные-члены). Специализировать можно только функции".
Вот эта формулировка меня сильно смутила - может быть я ее неверно понял. Что она означает?
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
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     О специализации шаблона: почему код компилируется?
Ответ Создать тему
Опции темы

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