В чем разница между С++ 03 явного определения шаблона экземпляра и С++ 11 явного шаблона декларации экземпляра?
Я имею в виду, почему определение экземпляра недостаточно для того, чтобы компилятор не генерировал реализацию для других типов? Что не так в следующем примере: представьте, что я разделил объявление и определение шаблона на два отдельных файла:
ах
#pragma once
template<typename T>
class A
{
public:
A(T t);
private:
T _t;
};
a.cpp
#include "A.h"
template<typename T>
A<T>::A(T t) : _t(t) {}
template class A<int>; // explicit instantiation
main.cpp
#include "A.h"
int main()
{
A<int> a(5); // fine, compiler generates header file,
// linker links with implementation from A.cpp file
// A<float> b(3.14f); // linker error, as expected
}
Есть ли издержки времени компиляции в приведенном выше примере? Если я правильно понимаю, в таком случае, используя явное определение экземпляра в отдельном файле *.cpp (вместе с реализацией шаблона), я делаю компилятор неспособным неявно создавать экземпляр шаблона с любыми другими типами. Как таковой, почему существует отдельный синтаксис для явного объявления экземпляра?
Как явное объявление экземпляра может ускорить время компиляции, если я УЖЕ скрыл реализацию в файле A.cpp, используя явное определение экземпляра, и запретил компилятору генерировать тело для других типов. Связано ли "явное объявление экземпляра" с "явным определением экземпляра", я имею в виду, следует ли использовать их оба, или это совершенно отдельные функции (например, явное объявление экземпляра можно использовать только в том случае, если явное определение экземпляра не использовалось)?
Правильно ли я думаю, что явное определение экземпляра предназначено только для того, чтобы вызвать ошибку, если никакой другой модуль перевода не создает экземпляр шаблона с использованием данного типа?