С ++: что такое явная реализация
Я читаю книгу C++ primer 5th edition, и я получил это:
Тот факт, что экземпляры создаются при использовании шаблона (§ 16.1.1, стр. 656), означает, что один и тот же экземпляр может появляться в нескольких объектных файлах. Когда два или более отдельно скомпилированных исходных файла используют один и тот же шаблон с одинаковыми аргументами шаблона, в каждом из этих файлов создается экземпляр этого шаблона.
Я не уверен, правильно ли я понял, поэтому я сделал пример здесь:
//test_tpl.h
template<typename T>
class Test_tpl
{
public:
void func();
};
#include "test_tpl.cpp"
//test_tpl.cpp
template<typename T>
void Test_tpl<T>::func(){}
//a.cpp
#include "test_tpl.h"
// use class Test_tpl<int> here
//b.cpp
#include "test_tpl.h"
// use class Test_tpl<int> here
Согласно абзацу выше, в этом примере создается экземпляр Test_tpl (Test_tpl<int>
) дважды. Теперь, если мы используем явную реализацию, Test_tpl<int>
должен быть создан только один раз, но я не знаю, как использовать эту технику для этого примера.
1 ответ
Вы будете иметь явную реализацию с
//test_tpl.h
template<typename T>
class Test_tpl
{
public:
void func();
};
//test_tpl.cpp
#include "test_tpl.h"
template<typename T>
void Test_tpl<T>::func(){} // in cpp, so only available here
template void Test_tpl<int>::func(); // Explicit instantiation here.
// Available elsewhere.
//a.cpp #include "test_tpl.h"
// use class Test_tpl<int> here
//b.cpp #include "test_tpl.h"
// use class Test_tpl<int> here