std::pair中的模板模板参数是什么意思?

3

我有一个kd-tree,其中有一个 Node 类如下所示:

template<typename DataType, unsigned int Dim>
struct Node
{
    DataType* pos;
    DataType payload;
    struct Node<DataType, Dim>* left;
    struct Node<DataType, Dim>* right;
};

我正在尝试设置一个元组类型,将查询节点到找到的邻居的距离和邻居节点本身结合起来,如下所示:

using std::pair<float, Node<typename DataType, Dim>*> = QueryResult;

不幸的是,上面的代码给我带来了错误:

[...] 错误:模板参数数量错误(应为2个,实际为1个)

于是我尝试了一些不同的方法,遵循我在这里找到的一些主题。 首先,我认为第二个参数可能应该在Node类内部声明而没有任何东西。

using std::pair<float, Node<DataType, Dim>*> = QueryResult;

[...] 错误:using-声明中不能出现模板ID

然后我尝试告诉编译器它是一个嵌套的模板;

using std::pair<float, template Node<typename DataType, Dim>*> = QueryResult;

[...] 错误:无效的模板参数2

还有一种解决方法使用了一个适配器类(adaptor class),但它也没有起作用。 我不确定我应该如何设置我在这里尝试做的事情。 任何帮助或指针将不胜感激。我对模板编程并不是很精通,但正在使用这个项目来增加我的知识。

谢谢!


3
你可以使用 using [新别名名称] = [被别名的内容]; 来实现别名,类似于 typedef - François Andrieux
2
问候,尤达大师!我擅自修改了您的问题,将节点定义放在前面,稍后再询问相关问题,以便我们这些凡人更好地理解。 - SergeyA
你在这里做什么还不清楚。这个DataType应该从哪里来? - SergeyA
2个回答

4
你差不多就有了。与 typedef 不同,使用声明将别名放在第一个符号位置。这意味着:
using std::pair<float, Node<DataType, Dim>*> = QueryResult;

需要进行
using QueryResult = std::pair<float, Node<DataType, Dim>*>;

如果您不知道在该点上需要什么DataTypeDim,那么您需要将其制作成一个模板别名,例如:
template<typename DataType, unsigned int Dim>
using QueryResult = std::pair<float, Node<DataType, Dim>*>;

然后您可以像使用下面这样使用它

QueryResult<type_you_want, dim_you_want> some_name;

我仍然不确定 DataType 应该从哪里来。OP 需要一个模板别名吗? - SergeyA
@SergeyA 刚刚添加了这个,因为我也不确定。 - NathanOliver
非常感谢。看来我把顺序搞错了,真是个愚蠢的错误。我绝对需要模板别名,因为我想让kdtree与一个具有模板数据类型和维数的模板点类一起工作。上面的解决方案似乎可行!再次感谢! :) - meetaig

1
如评论所述:
template<typename DataType, unsigned Dim>
using QueryResult = std::pair<float, Node<DataType, Dim>*>;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接