对于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的解决方案,但这也不起作用。 我不确定如何设置在这里要做的事情。 任何帮助或指针将不胜感激。我并不精通模板编程,但是正在使用这个项目来增加我的知识。
谢谢!
答案 0 :(得分:3)
您几乎拥有它。与typedef
不同,using声明将别名用作第一符号。那是
using std::pair<float, Node<DataType, Dim>*> = QueryResult;
需要成为
using QueryResult = std::pair<float, Node<DataType, Dim>*>;
如果您当时不知道DataType
和Dim
是什么,那么您需要将其设置为模板别名,例如
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>*>;