проблема gcc с явным созданием шаблона? - PullRequest
2 голосов
/ 29 апреля 2010

Насколько я понимаю, объявление или определение типа специализации должно вызывать создание экземпляра класса шаблона, но, похоже, этого не происходит с gcc. Например. У меня есть шаблон класса, шаблон класса Foo {};

Я пишу

  class Foo<double>;  

или

typedef Foo<double> DoubleFoo;  

но после компиляции таблица символов результирующего объектного файла не содержит членов Foo.

Если я создаю экземпляр :

Foo<double> aFoo;  

тогда, конечно, все символы генерируются.

Кто-нибудь еще испытывал это и / или имел объяснение?

Ответы [ 2 ]

6 голосов
/ 29 апреля 2010

Синтаксис для явного создания экземпляра:

template class Foo<double>;

См. C ++ 03 §14.7.2.

Надежда на то, что функции генерируются и связываются, но не удаляются после создания, но не использования экземпляра (самое минимальное неявное создание экземпляра), - довольно азартная игра.

0 голосов
/ 29 апреля 2010

Вы говорите о неявной реализации . Но это происходит только в том случае, если полные типы классов будут влиять на семантику программы.

В вашем случае тип класса не обязательно должен быть полным, потому что тип, который вы вводите, может оставаться неполным (тело класса не нужно, поэтому нет необходимости создавать его экземпляр). Чтобы проиллюстрировать это, вы также можете сказать typedef class MyFunnyThing type; в своем собственном утверждении, нигде не определяя этот класс.

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

Кроме того, чтобы объявить специализацию шаблона класса, весь смысл в том, чтобы предотвратить создание экземпляра, чтобы сказать компилятору "не создавать экземпляр, потому что позже Я специализирую это явно ". Объявление, если ваша специализация также пропускает template<> перед ней.

...