2010-04-29 2 views
2

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

Я пишу

class Foo<double>; 

или

typedef Foo<double> DoubleFoo; 

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

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

Foo<double> aFoo; 

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

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

ответ

6

Синтаксис для явного конкретизации является

template class Foo<double>; 

См C++ 03 §14.7.2.

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

+1

Я думаю, что Potatoswatter здесь что-то здесь. Я никогда не слышал о таком использовании для typedef. Это только для сокращенных типов и никогда ничего не создает. – daramarak

+0

Да, вы правы, я не уверен, где я взял эту дезинформацию о typedefs. Я был на правильном пути с объявлением, но оставил ключевое слово «шаблон». Спасибо –

0

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

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

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

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