Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
15 / 15 / 3
Регистрация: 04.07.2013
Сообщений: 76
1

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

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

Author24 — интернет-сервис помощи студентам
Добрый день.
Вроде бы, по правилам специализации шаблонов, можно только уточнять поведение шаблонного класса, но нельзя изменять его структуру. Однако, приведенный ниже код успешно компилируется и правильно работает:
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. Как это объяснить и стоит ли так делать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.07.2013, 17:20
Ответы с готовыми решениями:

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

Извлечь тип из специализации шаблона
template&lt;class T&gt; class cl { public: T t; cl(){ type t2; } }; ...

Специализации шаблона функции или перезагрузка
Доброго времени суток. Собственно, мою проблему можно увидеть в коде: #include &lt;iostream&gt;...

Ведет ли к инстанцированию определение явной специализации шаблона функции?
сабж ясен из заголовка

4
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
22.07.2013, 17:44 2
Цитата Сообщение от Gorillych Посмотреть сообщение
Вроде бы, по правилам специализации шаблонов, можно только уточнять поведение шаблонного класса, но нельзя изменять его структуру.
Где об этом сказано?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
22.07.2013, 17:45 3
Цитата Сообщение от Gorillych Посмотреть сообщение
но нельзя изменять его структуру.
хоть весь перелопатьте
0
15 / 15 / 3
Регистрация: 04.07.2013
Сообщений: 76
22.07.2013, 17:54  [ТС] 4
Croessmah, я только-только осваиваю эту тему по книге Александреску. На 29-й странице написано следующее (цитата): "...Используя лишь шаблоны, невозможно специализировать структуру класса (т.е. его данные-члены). Специализировать можно только функции".
Вот эта формулировка меня сильно смутила - может быть я ее неверно понял. Что она означает?
0
18901 / 9859 / 2410
Регистрация: 30.01.2014
Сообщений: 17,302
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()
{
}
Именно эта разница и имелась в виду.
0
18.09.2014, 22:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.09.2014, 22:17
Помогаю со студенческими работами здесь

Почему компилируется код?
#include &lt;stdio.h&gt; int main(void) { double d = 1.12; f(d); f(&quot;Hello&quot;); ...

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

[template] почему код не компилируется без конструктора
добрый вечер. вопрос поместил прямо в коде. http://rextester.com/AESO94403 #include...

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru