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

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

Восстановить пароль Регистрация
 
Gorillych
14 / 14 / 1
Регистрация: 04.07.2013
Сообщений: 76
22.07.2013, 17:20     О специализации шаблона: почему код компилируется? #1
Добрый день.
Вроде бы, по правилам специализации шаблонов, можно только уточнять поведение шаблонного класса, но нельзя изменять его структуру. Однако, приведенный ниже код успешно компилируется и правильно работает:
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!
 Аватар для gray_fox
1246 / 1129 / 54
Регистрация: 21.04.2012
Сообщений: 2,354
Завершенные тесты: 3
22.07.2013, 17:44     О специализации шаблона: почему код компилируется? #2
Цитата Сообщение от Gorillych Посмотреть сообщение
Вроде бы, по правилам специализации шаблонов, можно только уточнять поведение шаблонного класса, но нельзя изменять его структуру.
Где об этом сказано?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12085 / 6946 / 782
Регистрация: 27.09.2012
Сообщений: 17,230
Записей в блоге: 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
6785 / 3996 / 917
Регистрация: 30.01.2014
Сообщений: 6,816
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     О специализации шаблона: почему код компилируется?
Ответ Создать тему
Опции темы

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