Экземпляр шаблона в разных единицах перевода
Насколько я знаю, каждый шаблон имеет разные экземпляры в каждой единице перевода, и для моего понимания единица перевода - это примерно cpp
файл.
Итак, если у меня есть файл с именем test.hpp
со следующим содержанием:
// test.hpp
template <typename T> void test()
{
static T t = T(0);
return t++;
}
Для каждой единицы перевода у меня должен быть свой экземпляр test
даже если параметр шаблона T
то же самое в каждом из них. Я решил протестировать его, поэтому создал следующие файлы (для краткости опускаемые защитные элементы опущены):
// a.hpp
namespace A { void f(); }
// a.cpp
#include <iostream>
#include "a.hpp"
#include "test.hpp"
namespace A
{
void f() { std::cout << test<int>(); }
}
// b.hpp
namespace B { void f(); }
// b.cpp
#include <iostream>
#include "b.hpp"
#include "test.hpp"
namespace B
{
void f() { std::cout << test<int>(); }
}
Как мы видим, оба a.cpp
а также b.cpp
использует int
экземпляр test()
шаблон, но в разных единицах перевода, поэтому выполняем следующую программу:
// main.cpp
#include "a.hpp"
#include "b.hpp"
int main()
{
A::f();
B::f();
return 0;
}
Я ожидал выход 00
но я получаю 01
вместо. Средой разработки, которую я использую для тестирования этого кода, является MSVC2010 V10.0.4 SP1.
Так в чем же вопрос?
- Мое понимание шаблонов и единиц перевода неверно? или же...
- Я сделал что-то не так с этим тестовым кодом?
1 ответ
Мое понимание шаблонов и единиц перевода неверно?
Да. Это не правильно.
Копия шаблонной функции создается для каждого типа, а не для единицы перевода.
В вашем случае для test<int>
создается только 1 копия, и она используется во всех TU.