Экземпляр шаблона в разных единицах перевода

Насколько я знаю, каждый шаблон имеет разные экземпляры в каждой единице перевода, и для моего понимания единица перевода - это примерно 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.

Другие вопросы по тегам