Считается ли динамическое создание шаблона класса явным или неявным?

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

template <class T>
class Test {
public:
void nothing();
void operation();

static const int value;
};

template <class T>
const int Test<T>::value = 100;

template <class T>
void Test<T>::nothing() {
/* invalid code */
int n = 2.5f;
}

template <class T>
void Test<T>::operation() {
double x = 2.5 * value;
}

int main() {
std::unique_ptr<Test<int>> ptr = new Test<int>();  // mark1
ptr->operation(); // mark2
return 0;
}
  1. Весь шаблон класса инстанцируется в mark1?

  2. Если нет, значит ли это, что этот код будет правильно скомпилирован, а функция-член Test :: nothing () не будет создана?

1

Решение

Весь шаблон класса инстанцируется в mark1?

Да. Шаблон класса косвенным образом экземпляр — только шаблон класса, а не все его члены.

Если нет, значит ли это, что этот код будет правильно скомпилирован, а функция-член Test :: nothing () не будет создана?

не не означает, что, скорее, если nothing() не используется, это не мгновенно.

1

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

Полный ответ на это, вероятно, сильно зависит от того, какой компилятор вы используете.

В //mark1компилятор заметит, что по крайней мере части Test<int> класс надо создавать. Делать это правильно или нет, на более позднем этапе, зависит от дизайнера компилятора.

В //mark2, Test<int>.operation() Очевидно, что он необходим, либо помечен для последующего создания, либо создан на месте, опять же, в зависимости от того, что решили дизайнеры компилятора.

поскольку Test<int>.nothing() на него никогда не ссылаются, компилятор может свободно создавать его или нет. Некоторые старые компиляторы слепо создают экземпляр всего класса, но я подозреваю, что большинство современных компиляторов будут создавать только то, что им может оказаться необходимым (или, по крайней мере, то, что они не могут доказать, не является необходимым). Опять же, однако, где это происходит внутри компилятора, зависит от того, как разработчики компилятора создали компилятор.

0

Так что, как оказалось, для компилятора, который я использую (MS Visual C ++), мое предположение было верным, что для кода, представленного в вопросе, создание экземпляра члена шаблона класса не будет происходить при //mark1 а скорее в //mark2 а также Test<int>.nothing() не будет создан компилятором.

Тем не менее, похоже, я не учел критическую часть проблемы, с которой столкнулся. Мой реальный класс был частью виртуальной иерархии, и согласно библиотеке справки MSDN все виртуальные члены создаются при создании объекта. Таким образом, в приведенном выше примере, если обе функции-члены, т.е. operation() а также nothing(), виртуальны тогда на //mark2 компилятор попытается сгенерировать код для обеих функций и проверки nothing() потерпит неудачу

http://msdn.microsoft.com/en-us/library/7y5ca42y.aspx

http://wi-fizzle.com/howtos/vc-stl/templates.htm#t9

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