Что ж, я думаю, что меня очень смущает явное создание экземпляра шаблона ~> _ ‹~
- Может ли явное объявление создания экземпляра использовать неявное определение экземпляра?
- Что, если в программе существуют как явные, так и неявные определения экземпляров? Смогут ли они в конечном итоге превратиться в единую?
- Имеет ли какой-либо эффект явное объявление создания экземпляра, если оно помещено после определения неявного создания экземпляра?
Также см. Следующий код:
#include <iostream>
#include <vector>
std::vector<int> a; // Implicit instantiation definition.
// Explicit instantiation declaration.
extern template class std::vector<int>;
int main() {
std::cout << std::vector<int>().size(); // So what?
}
Это вызывает ошибку ссылки
/tmp/ccQld7ol.o: In function `_GLOBAL__sub_I_a':
main.cpp:(.text.startup+0x6e): undefined reference to `std::vector<int, std::allocator<int> >::~vector()'
collect2: error: ld returned 1 exit status
с GCC 5.2, но отлично работает с clang 3.6. Какой из них правильный по стандарту?
Я надеюсь, что есть проницательный способ понять явное создание экземпляров шаблона, чтобы можно было логически вывести и объяснить ответы на все вышеперечисленные вопросы.