Если вы хотите получить аргумент шаблонного класса, передаваемый параметром шаблона, вы должны ограничить допустимые типы для GraphType
.Вы делаете это по специализации:
template <class GraphType>
class Graph;
template <template <class> class GraphType, class VertexType>
class Graph<GraphType<VertexType> >
{
... // use GraphType<VertexType> as your graph, VertexType as your vertex type
};
Вы можете даже создать вспомогательную структуру, которая будет распаковывать аргументы для вас :
template <class T> struct get_arg;
template <template <class> class Tpl, class Arg>
struct get_arg<Tpl<Arg> >
{
typedef Arg type;
};
Обратите внимание, что этоРешение довольно негибкое - оно допускает только шаблоны с одним параметром в качестве аргументов для шаблона класса Graph
(представьте, что бы вы сделали, если бы добавили параметр в шаблон GraphMatrix
).Поэтому он обычно не используется.
Обычным решением является либо добавление typedefs к вашим классам (как вы делаете со своей «глупой линией»), либо, что еще лучше, использование классов черт и их специализация.