C++ 推导模板参数
我写了代码来构建二元搜索树,也写了一个bfs二元搜索树来测试它是否工作,但是我得到了很多bug,我调试了很长时间,没有找到bugC++ 推导模板参数,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
#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
的内部调用也需要明确其类型。