Если шаблон класса с методами, объявленный и определённый в файле .h, инстанциирован с одними и теми же аргументами шаблона в разных единицах трансляции, то я получу одни и те же символы в разных объектных файлах. Линкер ведь должен ругаться, но на практике такое использование шаблонов встречается часто. Почему это работает?
Re: Шаблон с одними и теми же аргументами в разных единицах трансляции?
Здравствуйте, pkl, Вы писали:
pkl>Если шаблон класса с методами, объявленный и определённый в файле .h, инстанциирован с одними и теми же аргументами шаблона в разных единицах трансляции, то я получу одни и те же символы в разных объектных файлах. Линкер ведь должен ругаться, но на практике такое использование шаблонов встречается часто. Почему это работает?
Потому что линкер учитывает, что такое может быть. И шаблоны тут не уникальны, inline функции, которые не могут быть встроены тоже дублируются в разных объектных файлах.
Re: Шаблон с одними и теми же аргументами в разных единицах трансляции?
Здравствуйте, pkl, Вы писали:
pkl>Если шаблон класса с методами, объявленный и определённый в файле .h, инстанциирован с одними и теми же аргументами шаблона в разных единицах трансляции, то я получу одни и те же символы в разных объектных файлах. Линкер ведь должен ругаться, но на практике такое использование шаблонов встречается часто. Почему это работает?
А ты при инстанцировании объекты тоже одинаково называл?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Шаблон с одними и теми же аргументами в разных единицах трансляции?
pkl>Если шаблон класса с методами, объявленный и определённый в файле .h, инстанциирован с одними и теми же аргументами шаблона в разных единицах трансляции, то я получу одни и те же символы в разных объектных файлах. Линкер ведь должен ругаться, но на практике такое использование шаблонов встречается часто. Почему это работает?
inline int f() { return 0; }
template<int q> int F() { return q; }
int main() {
return f() + F<0>();
}
cl -c 1.cpp
dumpbin /headers 1.obj
SECTION HEADER #4
.text name
0 physical address
0 virtual address
7 size of raw data
198 file pointer to raw data (00000198 to 0000019E)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
60501020 flags
Code
COMDAT; sym= "int __cdecl f(void)" (?f@@YAHXZ)
16 byte align
Execute Read
SECTION HEADER #5
.text name
0 physical address
0 virtual address
7 size of raw data
19F file pointer to raw data (0000019F to 000001A5)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
60501020 flags
Code
COMDAT; sym= "int __cdecl F<0>(void)" (??$F@$0A@@@YAHXZ)
16 byte align
Execute Read
то что выделено — инструкция линкеру, что это разделяемые символы.
Re: Шаблон с одними и теми же аргументами в разных единицах трансляции?
Здравствуйте, pkl, Вы писали:
pkl>Если шаблон класса с методами, объявленный и определённый в файле .h, инстанциирован с одними и теми же аргументами шаблона в разных единицах трансляции, то я получу одни и те же символы в разных объектных файлах.
Эти символы в объектных файлах помечаются как "слабые". Линкер, если видит дубликаты слабых символов, не считает это ошибкой и считает, что может использовать любой из них, а остальные выкинуть.