c++ - std::pair 中的模板模板参数

标签 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;

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

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

所以我按照我在此处找到的一些主题尝试了几种不同的方法。 首先我想也许第二个参数应该不声明任何东西,但在 Node 类中声明。

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

谢谢!

最佳答案

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

关于c++ - std::pair 中的模板模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54312546/

相关文章:

performance - vector::reserve() 似乎没有分配空间

C++判断硬盘剩余空间

c++ - #include header 保护格式?

c++ - const 正确性警告 c++

c++ - 嵌套 C++ 模板的一个例子

c++ - 在模板容器中存储元素

templates - 是否可以使用 Handlebars 将助手嵌套在选项哈希中?

c++ - 将在 STL 集上运行的函数泛化到所有集合

c++ - Visual Studio 2015,C++ 项目, fatal error c1510

c++ - 为什么 std::for_each + lambda 没有按预期工作?