Сказать могу так. Комплексные системы сборки проектов создаются прежде всего с расчетом на масштабную, параллельную разработку в большой команде (иногда даже распределенной между городами/странами на десятки офисов). В таких условиях без автодокументации, без быстрой навигации между файлами/библиотеками/проектами, без возможностей поиска использования кода в других местах, без быстрого автоматизированного рефакторинга и целой кучи самых разных ассистентов/джарвисов/дженкинсов работать становится очень сложно.
Слишком общий вопрос. Более того, в заголовке одно спрашивается, а в описании - уже совсем другое, с первым имеющее мало связи.
С настолько общими и дискуссионными вопросами тебе надо не на тостер, а на gamedev.ru.
Никаких проблем использовать следующий подход, в рамках приведенного кода, не вижу: "QueueList< listStruct< char* > > list".
Если код надо собирать gcc/clang, то пробелы между вложениями "<" и ">" крайне желательны. Иначе компилятор может воспринять запись ">>" в конце инстанцирования шаблона как символ побитового сдвига.
Иное дело если параметр шаблона "listStruct" используется в "QueueList". В общем, делай уточнения, сейчас вопрос на вопрос не тянет.