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

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