c++ - 将参数传递给具有容器和元素类型模板的函数

标签 c++ templates

这应该是一个简单的修复,但我在网上寻找如何传递具有容器和元素类型模板的函数的参数时感到困惑。我有以下二叉搜索树的实现,在主函数中调用它会抛出参数与函数模板不匹配的错误。

#include <iostream>
#include <vector>

template <typename ElementType>
struct BTreeNode
{
    ElementType value;
    BTreeNode<ElementType>* left;
    BTreeNode<ElementType>* right;
};

template <typename ElementType>
void Insert(BTreeNode<ElementType> ** root, int value)
{
    if (*root == NULL)
    {
        *root = new node(value);
    }
    else if ((*root)->value <= value)
    {
        insert(&((*root)->pRight), value);
    }
    else if ((*root)->value > value)
    {
        insert(&((*root)->pLeft), value);
    }
}


template <typename ContainerType, typename ElementType> 
BTreeNode<ElementType>* CreateBST(const ContainerType & elements, const size_t num_elements)
{
    BTreeNode<ElementType> * root = NULL;
    for (int i = 0; i < num_elements; ++i)
    {
        Insert(&root, elements[i]);
    }
    return root;
}


int main()
{
    std::vector<int> x = { 10, 5, 15, 5, 6, 7, 8, 89 };
    BTreeNode<int> * tree = CreateBST(x, x.size());
    //inOrderTraversal(pRoot);
    std::cout << std::endl;
    return 0;
}

最佳答案

问题是 CreateBST 的第二个模板参数 ElementType 是不可推导的,您需要像这样明确指定它

BTreeNode<int> * tree = CreateBST<std::vector<int>, int>(x, x.size());
//                               ^^^^^^^^^^^^^^^^^^^^^^^

或者你可以移除模板参数ElementType,让CreateBSTContainerType获取它(例如STL容器有成员类型值类型).

template <typename ContainerType> 
BTreeNode<typename ContainerType::value_type>* CreateBST(const ContainerType & elements, const size_t num_elements)
{
    BTreeNode<typename ContainerType::value_type> * root = NULL;
    for (int i = 0; i < num_elements; ++i)
    {
        Insert(&root, elements[i]);
    }
    return root;
}

然后你就可以像这样使用了

BTreeNode<int> * tree = CreateBST(x, x.size());

关于c++ - 将参数传递给具有容器和元素类型模板的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57702107/

相关文章:

c++ - 将 unsigned int 的三元组映射到 double——这是最优化/最有效的方法吗?

c++ - C++ 模板的别名?

c++ - 从嵌套结构继承: templates and pointers

c++ - 为右值和左值引用重载工厂函数 - 高效初始化

javascript - 如何在一次调用中使用jquery从外部文件获取多个kendo ui模板

c++ - 如何在 C++ 中对文本框中的值进行硬编码

使用结构成员和指针的 C++ 冒泡排序

c++ - 如何使用模板类查询 if(T==int)

c++ - 尝试在 vector 中查找 unique_ptr 时出现编译错误

c++ - 使用 vi[m] 自动为#define 生成值