Предположим, вы используете шаблонный класс в своем приложении, например, например. std :: tuple (или std :: shared_ptr, или как угодно), и у вас есть такие экземпляры:
typedef std::tuple<Book,Library> BookLibrary;
typedef std::tuple<Book,Chapter,Reader> BookChapterReader;
И затем вы используете эти экземпляры в других шаблонных классах, например, std :: map как член в классе:
class X
{
...
private:
std::map<Library,BookChapterReader> m_data;
};
Затем полученный файл PDB будет содержать описания, подобные этому (это можно увидеть с помощью утилиты DBH Microsoft Debugging Tools):
std::_Tree<std::_Tmap_traits<Library,std::tr1::tuple<Book,Chapter,Reader,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil>,std::less<Library>,std::allocator<std::pair<Library const ,std::tr1::tuple<Book,Chapter,Reader,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil> > >,0> >
Если у вас есть некоторые из этих конструкций, то файл PDB растет очень быстро, до момента, когда компоновщик просто отказывается связывать ваше приложение (очевидно, файл PDB имеет ограничение в 1 ГБ).
Решением может быть создание подкласса шаблонного экземпляра, например так:
class BookChapterReader : public std::tuple<Book,Chapter,Reader>
{
};
Это серьезно сократит символы. То, что упомянуто выше, теперь:
std::_Tree<std::_Tmap_traits<Library,BookChapterReader,std::less<Library>,std::allocator<std::pair<Library const ,BookChapterReader> >,0> >
Однако, используя наследование, мы вводим риск того, что кто-то может добавить данные в унаследованный класс, и нам может потребоваться ввести виртуальный деструктор (чего в данном случае я не хочу).
Кажется, что C ++ (или Visual Studio?) Имеет ограничение:
Нет ли более чистого способа «переименовать» шаблонную установку без использования наследования?
Создайте свою собственную версию обоих less
а также allocator
реализации вместо того, чтобы полагаться на значение по умолчанию, которое имеет очень длинное имя.
std::map< Library, BookChapterReader, CompareLibrary, MyAllocator > m_data;
Класс распределителя очень прост, как и функтор сравнения.
Других решений пока нет …