Создание шаблона класса
Я только что прочитал статью wiki о CRTP, и я немного запутался в создании экземпляра шаблона.
Согласно вики,
Тело функций-членов (определений) не создается до тех пор, пока после их деклараций.
Я не совсем понимаю, что это значит.
Предположим, что у меня есть шаблон класса:
template <typename T>
class A
{
public:
void foo(T t)
{
//...
};
};
Когда я создаю экземпляр шаблона класса A, он создает экземпляр функции-члена foo()?
Например:
//in .cpp file
int main()
{
A<int> a; //question 1
//class template is instantiated here, isn't it?
//What about foo(), is it instantiated too?
a.foo(10); //question 2
//according to the quotation, foo() will not be instantiated until it is used.
//if so, foo() is instantiated right here, not in question 1, right?
}
Ответы
Ответ 1
Кажется, вы что-то путаете:
Активация происходит во время компиляции, а не во время выполнения. Следовательно, вы не можете сказать "на какой строке" был создан шаблон класса или шаблон функции.
Тем не менее, вы правы в том, что шаблоны функций-членов не создаются вместе с шаблонами классов.
Вы можете заметить это в таком случае: у вас есть следующие файлы
- template.h(определяет класс A и функцию A:: foo)
- a.cpp(использует A)
- b.cpp(использует A и A:: foo)
Затем во время компиляции a.cpp будет создан экземпляр только A. Однако во время компиляции b.cpp оба экземпляра будут созданы.
Из-за этого в случае, если A:: foo содержит некоторый семантически недействительный код для заданного набора параметров шаблона, вы получите ошибки компиляции в b.cpp, но не в a.cpp.
Я надеюсь, что это очистит!
Ответ 2
С шаблонами классов правило эмпирического правила состоит в том, что фактически используются только те элементы, которые фактически используются.
Если вам нужна полная инстанция, С++ предлагает явное создание экземпляра (однако, как правило, вы этого не делаете: тот факт, что не каждый бит полностью создан, означает, что ваш шаблонный класс еще более общий, поскольку он снижает требования к T
, обратите внимание, что проверка синтаксиса и поиск не зависимых типов (материал, который не зависит от T
) все еще происходит).
Здесь вы найдете более полный ответ: Сведения о создании шаблона компиляторов GCC и MS