Явное создание экземпляра шаблона класса, а не создание экземпляра конструктора

Я работаю над проектом на 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) появляться в разборке как функция с другими. Мое понимание явного создания экземпляров состоит в том, что он должен указывать компилятору создавать экземпляры всех членов класса шаблона для заданного набора аргументов, так почему же конструктор не создается явно вместе со всеми другими функциями-членами?

0

Решение

Когда конструктор является функцией-членом шаблона, они не создаются, если не используются явно.

Вы бы увидели код для конструктора, если бы сделали его не шаблонной функцией-членом.

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;
};
2

Другие решения


По вопросам рекламы [email protected]