создание шаблона класса - PullRequest
       10

создание шаблона класса

14 голосов
/ 21 ноября 2011

Я только что прочитал вики-статью о 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?
}

Ответы [ 2 ]

12 голосов
/ 21 ноября 2011

Вы, кажется, путаете одну вещь:

Инстанцирование происходит во время компиляции , а не во время выполнения.Следовательно, вы не можете сказать «по какой строке» был создан шаблон класса или шаблон функции.

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

Вы можете наблюдать это в таком случае: у вас есть следующие файлы

  • template.h (определяет класс A и функцию A :: foo)
  • a.cpp (использует A)
  • b.cpp (использует A и A:: foo)

Тогда при компиляции a.cpp будет создан только A.Однако во время компиляции b.cpp оба экземпляра будут созданы.

Из-за этого в случае, если A :: foo содержит некоторый семантически недопустимый код для данного набора параметров шаблона, вы получите ошибки компиляции в b.cpp, но не a.cpp.

Надеюсь, это прояснит ситуацию!

9 голосов
/ 21 ноября 2011

При использовании шаблонов классов практическое правило заключается в том, что создаются только те члены, которые фактически используются.

Если вы хотите выполнить полную реализацию, C ++ предлагает явную реализацию (однако обычнонет, тот факт, что не каждый бит полностью создан, означает, что ваш шаблонный класс является еще более универсальным, поскольку он снижает требования к T, обратите внимание, что проверка синтаксиса и поиск независимых типов (вещи, которые не зависят отT) все еще происходит).

Более полный ответ вы найдете здесь: Детали создания шаблонов компиляторов GCC и MS

...