Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Статические поля в шаблоне класса

309
24 сентября 2006 года
el scorpio
1.1K / / 19.09.2006
При компиляции программы с использованием шаблона класса, содержащего статическое поле шаблонного типа, линковщик выдаёт сообщение: "Unresolved external TTemplate <TMyClass> :: _fBackup". :(
С этим всё понятно - отсутствует реализация :confused: . Вопрос - почему?
Исходный код шаблона:
 
Код:
template <class T> class PACKAGE TTemplate
{
private:
    static T _fDefault; // статическое поле
//.........
};

Статическая переменная - общая для всех объектов класса, и распологается в верхней области стека, доступна по абсолютному её адресу в любой момент выполнения программы.
Так как для каждой реализации шаблона фактически формируется свой класс с используемыми методами, логично предположить, что для каждой реализации будет создана соответствующая статическая переменная.

Но компилятор считает инача, и не реализует ни одного её экземпляра.

Что это - такая особенность стандарта ANSI или просто баг компилятора?
И есть ли возможность создать аналогичный код? Ибо алгоритм, написанный иначе будет не таким простым.
3
24 сентября 2006 года
Green
4.8K / / 20.01.2000
А причем тут стек? (кстати статические поля находятся в спец. секции, а не на стеке).

Необходимо не только объявлять, но и определять статические поля, и это не зависит от того шаблонный класс или нет:
 
Код:
template <class T>
class TTemplate
{
private:
    static T _fDefault; // статическое поле
//.........
};

template <class T>
T TTemplate<T>::_fDefault;
309
25 сентября 2006 года
el scorpio
1.1K / / 19.09.2006
[QUOTE=Green]А причем тут стек? (кстати статические поля находятся в спец. секции, а не на стеке).
[/QUOTE]
А где находится эта "спецсекция" - разве не в верхней части стека? И как в ином случае к ним производится адресация?

А за код спасибо. Тем более, что об этом в хелпе ни слова.
А то накладно было бы вызывать "конструктор по умолчанию" для приведения нестатичного поля объекта в исходный вид.

А про "определение" :eek: статичных полей я и не подозревал . Кстати, зачем это нужно - для обычных классов у меня всё работало :confused:.
240
25 сентября 2006 года
aks
2.5K / / 14.07.2006
[QUOTE=el scorpio]
А про "определение" :eek: статичных полей я и не подозревал . Кстати, зачем это нужно - для обычных классов у меня всё работало :confused:.[/QUOTE]
Хочешь сказать если в нешаблонном классе создать статическую переменную код просто так соберется? Не может такого быть - обязательно надо определять.
Описанная в классе статическая переменная - это только как бы описание. Не статические переменые создаются и под них выделяется память при создании объекта. А для статической нужно сделать это вручную - тоесть как бы создать ее реализацию, так же как для методов.
3
25 сентября 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=el scorpio]
А где находится эта "спецсекция" - разве не в верхней части стека? И как в ином случае к ним производится адресация?
[/QUOTE]
Да нет, она находится там, куда её поместил загрузчик, так же как и секции кода, ресурсов и пр.

[QUOTE=el scorpio]
А про "определение" :eek: статичных полей я и не подозревал . Кстати, зачем это нужно - для обычных классов у меня всё работало :confused:.[/QUOTE]
Совсем не уверен, что такое работало.
Это могло компилироваться, но не линковаться.
Может, ты просто не обращался к статическим полям?
Тогда линкер про них ничего и не знал бы, соотв. не выдал бы ошибку.
309
25 сентября 2006 года
el scorpio
1.1K / / 19.09.2006
Green
Вы правы. Я ранее не использовал статические поля. Функции - часто, а поля не приходилось
Кстати, в имеющейся у меня электронной версии книги "Введение в язык С++" Бьярна Страустрапа (1995 г.) приведённый код не упоминается ни словом :eek:.
Более того, "определение" статических полей класса там описывается "между делом", как само-собой разумеещееся: "объявил" и ладно :confused:.
И чем вообще вызвана обязательность "определения" уже объявленного статического поля?
3
25 сентября 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=el scorpio]
И чем вообще вызвана обязательность "определения" уже объявленного статического поля?[/QUOTE]
Для начала напомню, что любая переменная должна быть (последовательно) объявлена (объявляется имя и тип переменной), определена (выделяется место под значение), инициализирована (устанавливается конкретное значение).

В случае переменной, как обычного поля класса, она определяется, т.е. под значение выделяется место, в момент создания экземпляра данного класса.
В случае же статического поля оно должно быть определено единожды для всех экземпляров данного класса и это никак не связано с созданием конкретного экземпляра класса. По большому счету, можно обратиться к статическому полю вообще не имеея экземпляров этого класса. Поэтому и определено (и кстати, может быть и инициализировано) статическое поле отдельно.
309
26 сентября 2006 года
el scorpio
1.1K / / 19.09.2006
Про инициализацию - это понятно.
Просто, если статическое поле инициализируется "значением по умолчанию" - то приходится по сути писать второй раз одно и тоже. Неужели компилятор такой дурной, что с первого раза не понимает?

Статические переменные в функциях, кстати, создаются одной строкой.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог