为什么函数 Returns 结构模板时无法推导模板参数

Why Could Not Deduce Template Argument When Function Returns a Struct Template

我正在尝试重载一个 CreateBST 函数,它接受一个可迭代的元素容器及其大小。代码如下:

#include <iostream>
#include <vector>

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

template <typename ContainerType, typename ElementType>
BTreeNode<ElementType>* CreateBST(const ContainerType& elements, const size_t num_elements);

int main()
{
    std::vector<int> elems{ 67, 34, 82, 12, 45, 78 };
    
    BTreeNode<int>* btree = CreateBST(elems, elems.size());
}

我收到以下编译器错误:

error C2672: 'CreateBST': no matching overloaded function found
error C2783: 'BTreeNode<ElementType> *CreateBST(const ContainerType &,const size_t)': could not deduce template argument for 'ElementType'

有人能解释一下为什么会出现这个错误吗?另外,我应该如何声明一个函数来接受像 std::vector 这样的模板模板参数及其元素类型?

Can someone explain me why I am getting this error?

模板参数只能从调用站点的参数中推导出来。虽然该信息,即 ElementType 实际上存在于第一个参数的类型中,但您的模板不知道如何提取该类型。


how am I supposed to declare a function to take an template template parameter like std::vector and it's element type?

像这样:

template <template <typename...> class ContainerType, 
          typename ElementType>
BTreeNode<ElementType>* CreateBST(const ContainerType<ElementType>& elements, 
                                  const size_t num_elements);

请注意,第一个模板参数是模板模板参数。这允许您传入 vector<int>,并推导出类型的 int 部分。