2016-07-26 2 views
-2

Мне интересно, как работают функции члена шаблона. В частности, когда создается экземпляр функции-члена шаблона, переопределяется весь класс? Моя путаница исходит из того, что (если я прав) классы шаблонов не являются классами в собственном смысле. то есть при создании экземпляра компилятор создает определение для совершенно нового класса. То же самое для функций шаблона. Однако классы с функцией шаблона кажутся действительными классами, поэтому я не уверен, как они могут работать. Таким образом, мне интересно, после создания экземпляра функции-члена шаблона, что происходит с определением класса? Более того, если я передаю класс с функцией члена шаблона в класс шаблона, могу ли я использовать функцию члена шаблона? Может ли это вызвать проблему? Я попробовал это один раз, но получил ошибку, заявив, что несколько функций, где определено больше, чем когда-то, хотя я не уверен, что это была причина, или может быть другая причина моей ошибки. Есть ли еще одна оговорка при использовании статических функций-членов шаблона?Как работают функции члена шаблона в C++?

+0

Специализируется на шаблоне, будь то шаблон шаблона или шаблон функции, создается при первом использовании в единицах перевода. Классы могут иметь шаблоны участников (как шаблоны классов, так и функции), а также шаблоны классов. Более того, функции-члены шаблонов классов сами по себе неявно функционируют шаблоны. –

+0

Обратите внимание, что шаблон никогда не создается. Могут быть созданы только * специализации * шаблона. –

+0

Хорошо, спасибо. –

ответ

2

Определение класса остается таким, каким оно есть; вся эта функция шаблона генерирует семейство функций-членов для этого класса. В качестве примера:

class A { 
    public: 
     template<typename T> foo (T &t); 
} 

не является концептуально отличается от вас писать:

class A { 
    public: 
     foo (bool &t); 
     foo (int &t); 
     foo (double &t); 
} 

... просто удобнее. И в последнем примере вы не ожидали, что новый класс будет создан для каждой функции?

Возможно, путаница возникает из-за того, что функции являются частью структуры памяти класса; что каждая функция сама содержится в классе и будет создаваться где-то в памяти всякий раз, когда создается объект класса. Это понятие неверно. Функции (templated, global, member, lambda или other) никогда не создаются «на лету» или не копируются в памяти; они представляют собой статическую и неизменную часть исполняемого изображения. Макет памяти класса не изменяется из-за наличия дополнительного набора функций, даже если они генерируются членом шаблона.

+0

Похоже, что в этом примере отсутствуют сильные понятия ввода текста. Использование шаблонов с типами создает новые типы, где ваш 'foo' может иметь' A * x = new A (true); 'или' A * y = new A (123); 'с' x' и 'y' заканчивается как тот же тип – infixed

+0

@infixed 'foo' не является конструктором, поэтому ваш примерный код не применяется. Вопрос в частности касается не-шаблонных классов с функцией-членом шаблона. Никаких новых типов не создается. –

0

Определение класса шаблона создается при создании экземпляра класса. Каждая функция-член создается при использовании. Это фактически позволяет вам иметь функции-члены, которые не будут работать, если они вызываются при создании экземпляра класса с некоторыми типами, а не с другими. Тем не менее, вы должны убедиться, что подписи функции либо синтаксически жизнеспособны, либо не работают с SFINAE. Он будет рассмотрен во время первого этапа разбора. Тело, если функция не является самим шаблоном, будет проверяться на поиск имени ... поэтому зависимые имена должны быть помечены как таковые через typename.

+0

Я не думаю, что это совершенно верно.Нет такой вещи, как «определение класса шаблона». Существует определение * класса шаблона *, но это никогда не создается. Создаются только * специализации * шаблона. Более того, специализация не создается каждый раз, когда она используется, но только в первый раз, когда она используется (внутри каждой единицы перевода). –

Смежные вопросы