В какой момент создаются экземпляры шаблонов функций в следующем шаблоне класса?
// a.h
#pragma once
template <typename T>
class A {
public:
template <typename T2> void func1(T2 t);
void func2(T t);
T func3();
void func4();
// SECONDARY ISSUE
// Is there any difference in writing this:
A& operator=(A const&) = default;
// or this:
A<T>& operator=(A<T> const&) = default;
};
-----------------------------
// a.cpp
#include "a.h"
template <typename T>
template <typename T2>
void A<T>::func1(T2 t)
{
// do sth
}
template <typename T>
void A<T>::func2(T t)
{
// do sth
}
template <typename T>
T A<T>::func3()
{
T t;
// do sth
return t;
}
template <typename T>
void A<T>::func4()
{
T t;
// do sth with t
}
template class A<int>; // explicit instantiation
-----------------------------
// main.cpp
#include "a.h"
int main()
{
A<int> a1;
a1.func1<double>(1.);
a1.func1(1.);
a1.func2(2);
a1.func3();
a1.func4();
}
В шаблоне свободной функции экземпляр шаблона создается, когда он вызывается с конкретным типом или с явным созданием экземпляра.
Что происходит с шаблонами классов? Я предполагаю, что func2() - func4()
создаются с явным созданием экземпляра шаблона класса template class A<int>;
. Или занимает место инстанцирования в момент первого вызова функции, т.е. например a1.func2(2.)
?
В случае func1()
создание экземпляра, вероятно, происходит с вызовом a1.func1<double>(1.);
, так как это первый раз, когда известен второй параметр шаблона T2
?
Относительно второстепенного вопроса: имеет ли значение, пишу ли я A
или A<T>
? Я думаю, что это то же самое, но я не уверен в этом.