Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 推导模板参数_C++ - Fatal编程技术网

C++ 推导模板参数

C++ 推导模板参数,c++,C++,我写了代码来构建二元搜索树,也写了一个bfs二元搜索树来测试它是否工作,但是我得到了很多bug,我调试了很长时间,没有找到bug #include<vector> template<typename Key, typename Value> struct BSTNode{ Key key; Value value; BSTNode * left; BSTNode * right; BSTNode(Key k, Value v, B

我写了代码来构建二元搜索树,也写了一个bfs二元搜索树来测试它是否工作,但是我得到了很多bug,我调试了很长时间,没有找到bug

#include<vector>

template<typename Key, typename Value>
struct BSTNode{
    Key key;
    Value value;
    BSTNode * left;
    BSTNode * right;
    BSTNode(Key k, Value v, BSTNode *l=NULL, BSTNode *r=NULL) :
    key(k), value(v), left(l), right(r) {}
};

template<typename Key, typename Value>
BSTNode<Key, Value>* min_height(std::vector<int> &v, int left, int right ) {
    if(left<=right){
        int mid=left+ (right-left)/2;
        BSTNode<Key, Value>* node=new BSTNode<Key, Value>(v[mid], v[mid]);
        node->left=min_height(v, left, mid-1 );
        node->right=min_height(v, mid+1, right );
        return node;
    }
}

int main(){
    std::vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    BSTNode<int, int>* root=min_height(v, 0, 5);
}
#包括
模板
结构节点{
钥匙;
价值观;
节点*左;
节点*对;
BSTNode(键k,值v,BSTNode*l=NULL,BSTNode*r=NULL):
键(k),值(v),左(l),右(r){
};
模板
BSTNode*最小高度(标准::向量&v,左整数,右整数){
如果(leftleft=最小高度(v,left,mid-1);
节点->右侧=最小高度(v,中间+1,右侧);
返回节点;
}
}
int main(){
std::向量v;
v、 推回(1);
v、 推回(2);
v、 推回(3);
BSTNode*root=最小高度(v,0,5);
}
编译器错误:

prog.cpp:BSTNode*min_height(std::vector&,int,int)函数中:
prog.cpp:48:42:错误:调用“minu height(std::vector&,int&,int&)”时没有匹配函数
项目cpp:48:42:注:候选人为:
程序cpp:44:22:注:模板BSTNode*最小高度(标准::向量和,整数,整数)
程序cpp:44:22:注意:模板参数扣除/替换失败:
prog.cpp:48:42:注意:无法推断模板参数“Key”
prog.cpp:49:41:错误:调用“minu height(std::vector&,int&,int&)”时没有匹配函数
项目cpp:49:41:注:候选人为:
程序cpp:44:22:注:模板BSTNode*最小高度(标准::向量和,整数,整数)
程序cpp:44:22:注意:模板参数扣除/替换失败:
prog.cpp:49:41:注意:无法推断模板参数“Key”
prog.cpp:在函数“int main()”中:
程序cpp:63:45:错误:调用“最小高度(std::vector&,int,int)”时没有匹配函数
项目cpp:63:45:注:候选人为:
程序cpp:44:22:注:模板BSTNode*最小高度(标准::向量和,整数,整数)
程序cpp:44:22:注意:模板参数扣除/替换失败:
prog.cpp:63:45:注意:无法推断模板参数“Key”
程序cpp:63:22:警告:未使用的变量“根”[-Wunused variable]

不能根据返回类型推断模板类型

但您可以明确表示:

BSTNode<int, int>* root = min_height<int, int>(v, 0, 5);
然而,从外观上看,
min\u height
总是将整数放入
键和
值中。您可以通过对一些
类型的
向量进行处理使其更通用,并将该类型用作
键和
值类型使其更明确

template<typename Type>
BSTNode<Type, Type>* min_height(vector<Type> &v, int left, int right ) {
    if(left<=right) {
        int mid = left + (right - left)/2;
        BSTNode<Type, Type>* node = new BSTNode<Type, Type>(v[mid], v[mid]);
        node->left = min_height(v, left, mid - 1);
        node->right = min_height(v, mid+1, right);
        return node;
    }
}
模板
BSTNode*最小高度(向量&v,左整数,右整数){
如果(左=最小高度(v,左,中间-1);
节点->右侧=最小高度(v,中间+1,右侧);
返回节点;
}
}
用法:

BSTNode<int, int>* root = min_height(v, 0, 5);
BSTNode*root=最小高度(v,0,5);

您无法根据返回类型推断模板类型

但您可以明确表示:

BSTNode<int, int>* root = min_height<int, int>(v, 0, 5);
然而,从外观上看,
min\u height
总是将整数放入
键和
值中。您可以通过对一些
类型的
向量进行处理使其更通用,并将该类型用作
键和
值类型使其更明确

template<typename Type>
BSTNode<Type, Type>* min_height(vector<Type> &v, int left, int right ) {
    if(left<=right) {
        int mid = left + (right - left)/2;
        BSTNode<Type, Type>* node = new BSTNode<Type, Type>(v[mid], v[mid]);
        node->left = min_height(v, left, mid - 1);
        node->right = min_height(v, mid+1, right);
        return node;
    }
}
模板
BSTNode*最小高度(向量&v,左整数,右整数){
如果(左=最小高度(v,左,中间-1);
节点->右侧=最小高度(v,中间+1,右侧);
返回节点;
}
}
用法:

BSTNode<int, int>* root = min_height(v, 0, 5);
BSTNode*root=最小高度(v,0,5);

你是认真的吗???我们不是人类编译器。你是认真的吗???我们不是人类编译器。非常感谢你,彼得!我尝试了第二种解决方案,效果很好。但对于第一种解决方案,编译器仍然给了我错误的信息:这是同样的问题。我想知道你的意思是什么“无法根据返回类型推断模板类型。“?我已经更新了答案。对
min_height
的内部调用也需要明确其类型。非常感谢Peter!我尝试了第二种解决方案,并且效果良好。但对于第一种解决方案,complier仍然给了我错误的信息:这是相同的问题。我想知道你的意思是什么?”“您无法根据返回类型推断模板类型。”?我已更新了答案。对
min\u height
的内部调用也需要明确其类型。