С ++: что такое явная реализация

Я читаю книгу 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
Другие вопросы по тегам