Почему он пытается найти деструктор дважды?

Я пробовал следующий фрагмент кода:

GeneralTemplate.h

#ifndef _GENERATEMPLATE_H_
#define _GENERATEMPLATE_H_

#include <iostream>

template <class T>
class GeneralTemplate
{
  public:
  GeneralTemplate();
  GeneralTemplate(const GeneralTemplate &g);

  ~GeneralTemplate();

  GeneralTemplate& operator= (GeneralTemplate const& g);

  template <class M>
  void arbitraryFunction(const M &m);
};

#endif

main.cpp

#include "GeneralTemplate.h"

#include <iostream>

int main()
{
    GeneralTemplate<int> gInt;
    gInt.arbitraryFunction(2.3);
    return 0;
}

обратите внимание, что у меня нет реализации для функций-членов шаблонного класса. Но проблема не в этом. Я знаю, как это сделать! Если я попытаюсь скомпилировать main.cpp, я должен получить ошибку ссылки, и это то, что я получаю. Вопрос в том, почему он пытается найти деструктор дважды (последние две строки ошибки ниже).

$g++ main.cpp 
/tmp/cckrdPCs.o: In function `main':
main.cpp:(.text+0x13): undefined reference to `GeneralTemplate<int>::GeneralTemplate()'
main.cpp:(.text+0x34): undefined reference to `void GeneralTemplate<int>::arbitraryFunction<double>(double const&)'
main.cpp:(.text+0x45): undefined reference to `GeneralTemplate<int>::~GeneralTemplate()'
main.cpp:(.text+0x61): undefined reference to `GeneralTemplate<int>::~GeneralTemplate()'
collect2: ld returned 1 exit status

1 ответов


Это скорее всего связано с исключением безопасности. Если arbitraryFunction выбрасывает исключение, стек должен быть размотан, что означает gInt необходимо уничтожить рано. Поскольку все это происходит в main, где дальнейшее разматывание никогда не произойдет, сомнительно, действительно ли ему нужны два вызова деструктора.... но поведение, которое вы наблюдаете, не совсем от стены.