std::pair 中的模板模板参数

template template parameter in std::pair

对于 kd 树,我有一个 Node class,如下所示:

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;

不幸的是上面的代码给我错误:

[...] error: wrong number of template arguments (1, should be 2)

所以我尝试了几种不同的方法,遵循我在此处找到的一些线索。 首先我想也许第二个参数应该不声明任何东西,但是在 Node class.

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

[...] error: a template-id may not appear in a using-declaration

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

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

[...] error: template argument 2 is invalid

还有一个使用 adaptor class 的解决方案,但也没有用。 我不确定如何设置我想在这里做的事情。 任何帮助或指示将不胜感激。我不是很精通模板编程,但我正在使用这个项目来增加我的知识。

谢谢!

评论:

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

你快搞定了。与 typedef 不同,using 声明将别名作为第一个符号。也就是说

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;