Я работаю над проектом на C ++, и у меня возникают проблемы с пониманием того, какие члены класса шаблона получают в явной форме, когда я явно создаю экземпляр класса шаблона. Я написал следующий файл, который затем компилирую, используя конфигурацию выпуска Visual C ++ 2008 Express Edition, а затем вставляю в дизассемблер.
template<typename T> class test {
public:
template<typename T> test(T param) {
parameter = param;
};
~test() {};
int pop();
int push();
T parameter;
};
template<typename T> int test<T>::push() {return 1;}
template<typename T> int test<T>::pop() {return 2;}
template class test<int>;
int main() {
return 0;
}
Игнорируя, что этот файл на самом деле не нуждается в шаблонах на данный момент, это прекрасно компилируется. Я бросаю exe в дизассемблер, и он говорит мне, что тест<ИНТ>:: pop (void), тест<ИНТ>:: push (void) и тестирование<ИНТ>:: ~ тест<ИНТ>(void) являются функциями в exe, но я не вижу конструктор. Я знаю, что могу явно создать экземпляр конструктора
template test<int>::test(int);
который вызывает тест<ИНТ>::тестовое задание<ИНТ>(int) появляться в разборке как функция с другими. Мое понимание явного создания экземпляров состоит в том, что он должен указывать компилятору создавать экземпляры всех членов класса шаблона для заданного набора аргументов, так почему же конструктор не создается явно вместе со всеми другими функциями-членами?
Когда конструктор является функцией-членом шаблона, они не создаются, если не используются явно.
Вы бы увидели код для конструктора, если бы сделали его не шаблонной функцией-членом.
template<typename T> class test {
public:
/***
template<typename T> test(T param) {
parameter = param;
};
***/
test(T param) : parameter(param) {}
~test() {}
int pop();
int push();
T parameter;
};