【问题标题】:template template parameter in std::pairstd::pair 中的模板模板参数
【发布时间】:2019-01-22 16:28:22
【问题描述】:

对于 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;

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

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

所以我尝试了几种不同的方法,遵循我在这里找到的一些线程。 首先,我想也许第二个参数应该在没有任何内容的情况下声明,而是在 Node 类中。

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

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

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

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

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

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

谢谢!

【问题讨论】:

  • using [new alias' name] = [what it aliases];。你像typedef一样使用它。
  • 您好,尤达大师!我冒昧地重新表述了您的问题,以便我们(凡人)更好地理解它 - 将节点定义放在首位,然后再提出问题。
  • 不清楚你在这里做什么。 DataType 预计来自哪里?

标签: c++ templates stl template-templates


【解决方案1】:

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

【讨论】:

  • 我仍然不确定 DataType 应该来自哪里。 OP 需要模板别名吗?
  • @SergeyA 刚刚补充了,因为我也不确定。
  • 非常感谢。确实,看来我的订单错了……愚蠢的错误。我绝对需要模板别名,因为我希望 kdtree 使用具有模板化数据类型和维数的模板化点类。上面的这个解决方案似乎有效!再次,谢谢! :)
【解决方案2】:

如评论:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 2015-05-19
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    相关资源
    最近更新 更多