为什么函数 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
部分。
我正在尝试重载一个 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
部分。