嵌套模板(即模板<typename t <=“”typename =“”templateargumentfor_t =“”>&gt;)

时间:2017-02-15 11:45:54

标签: c++ templates

我需要为我的类获取2个类型参数:T1,这是一个具有模板的类,以及T2,它是T1模板的参数。

在我的例子中,一个Vertex类型(有2个,一个继承自另一个),以及vertex存储的数据类型(在我的例子中是name / id)。

我希望能够写出这样的内容:

template <   typename VertexType  < typename VertexIDType >    >

(这给了我错误:C2143语法错误:缺少&#39;,&#39;之前&#39;&lt;&#39;)

所以我的班级会是这样的:

class Graph
{
public:    
    Graph(const List<VertexType<VertexIDType>>& verticesList); 
    VertexType<VertexIDType>& getVertexByID(const VertexIDType& ID) const;

private:    
    List<VertexType<VertexIDType>> vertices;
};

(&#39;列表&#39;是我(不是std&#39; s)链接列表的实现。)

我也试过template <typename VertexType, typename VertexIDType> 但后来我在函数Graph(const List<VertexType<VertexIDType>>& verticesList);中出错了 (C2947期待&#39;&#39;终止模板参数列表,找到&#39;&lt;&#39;)

template < typename VertexType < template <typename VertexIDType> > >

(这也给了我错误C2143)

我真的是那种试图自己解决所有问题的人,但这个令人沮丧。我无法找到一个我理解是否/如何在我的代码中实现的答案。 我现在已经完成了OOP(c ++)课程。我有一些模板经验。我已经编写了成功获得1或2个参数的模板,但没有这样的。

请帮我解决这个问题,最好尽可能优雅:)

感谢。

2 个答案:

答案 0 :(得分:3)

您可以使用模板模板参数:

template <template <typename> class VertexType, typename VertexIDType>
class graph;

graph<MyVertexType, MyVertexIDType> //usage

或者,您可以只使用一种类型并在部分特化中提取ID类型:

template <typename Vertex>
class graph;

template <template <typename> class VertexType, typename VertexIDType>
class graph <VertexType<VertexIDType>> {
    //...
}; 

graph<MyVertexType<MyVertexIDType>> //usage

答案 1 :(得分:1)

对于你提出的问题,TartanLlama的答案很好,但你可能想稍微改变一下你的方法。如果您要求VertexType必须定义typedef VertexIDType,那么您可以写:

template <class VertexType>
class Graph
{
public:    
    Graph(const List<VertexType>& verticesList); 
    typedef typename VertexType::VertexIDType VertexIDType;
    VertexType& getVertexByID(const VertexIDType& ID) const;

private:    
    List<VertexType> vertices;
};

请注意VertexIDType的typedef中的typename。需要说“这个名称​​必须是一个类型而不是变量”。

假设您的当前VertexType在VertexIDType上模板化:

template <classname VertexIDType>
struct VType1 {
    double stuff; // Or whatever you have in your vertex
};

您需要将其更改为:

template <classname VertexIDType>
struct VType1 {
     double stuff;
     typedef VertexIDType VertexIDType;  // Provide a typedef for VertexIDType.
};

这类似于标准库所采用的方法,其中每个类型容器都有value_type的typedef等。