std :: pair

时间:2019-01-22 16:28:23

标签: c++ templates stl template-templates

对于kd树,我有一个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;

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

  

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

因此,按照我在此处找到的一些线程,我尝试了几种不同的方法。 首先,我认为也许应该在Node类内部声明第二个参数,而无需声明任何内容。

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

[...]错误:使用声明中可能未显示模板ID

因此我尝试告诉编译器这是一个嵌套模板;

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:3)

您几乎拥有它。与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;

答案 1 :(得分:2)

如评论所述:

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