这应该是一个简单的修复,但我在网上寻找如何传递具有容器和元素类型模板的函数的参数时感到困惑。我有以下二叉搜索树的实现,在主函数中调用它会抛出参数与函数模板不匹配的错误。
#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
,让CreateBST
从ContainerType
获取它(例如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/