C++ 继续推导模板参数

C++ 继续推导模板参数,c++,C++,在这个二叉树而不是二叉搜索树的情况下,模板中只有一个类型为T的参数。如主函数所示,我不需要显式的最小高度(v,0,5),但最小高度(v,0,5)就足够了。但是,在二进制搜索树的情况下,有两个模板参数,使用方法不起作用。我想知道为什么?多谢各位 #include <iostream> #include<string> #include<vector> using namespace std; template<typename T> struct B

在这个二叉树而不是二叉搜索树的情况下,模板中只有一个类型为T的参数。如主函数所示,我不需要显式的最小高度(v,0,5),但最小高度(v,0,5)就足够了。但是,在二进制搜索树的情况下,有两个模板参数,使用方法不起作用。我想知道为什么?多谢各位

#include <iostream>
#include<string>
#include<vector>
using namespace std;
template<typename T>
struct BTNode{
 T data;
 BTNode * left;
 BTNode * right;
 BTNode(T d, BTNode *left=NULL, BTNode * right=NULL): data(d) {} 
 };

template<typename T>
BTNode<T>* min_height(vector<T> &v, int left, int right ){// here is different from my paper code

 if(left<=right){
    int mid=left+ (right-left)/2;
    BTNode<T>* node=new BTNode<T>(v[mid]);
    node->left=min_height(v, left, mid-1 );
    node->right=min_height(v, mid+1, right );
    return node;
    }
}

int main() {
  vector<int> v;
  v.push_back(1);
  v.push_back(2);
  v.push_back(3);
  v.push_back(4);
  v.push_back(5);
  v.push_back(6);
  BTNode<int>* root=min_height(v, 0, 5);

  return 0;
}
#包括
#包括
#包括
使用名称空间std;
模板
结构BTNode{
T数据;
BTNode*左;
BTNode*对;
BTNode(td,BTNode*left=NULL,BTNode*right=NULL):数据(d){}
};
模板
BTNode*min_height(vector&v,int left,int right){//这里与我的论文代码不同
如果(leftleft=最小高度(v,left,mid-1);
节点->右侧=最小高度(v,中间+1,右侧);
返回节点;
}
}
int main(){
向量v;
v、 推回(1);
v、 推回(2);
v、 推回(3);
v、 推回(4);
v、 推回(5);
v、 推回(6);
BTNode*root=最小高度(v,0,5);
返回0;
}

因为在单模板参数T的情况下,您在其中一个参数中使用了T,第一个参数是vector&v。因此,当编译器看到行时

BTNode<int>* root=min_height(v, 0, 5);
BTNode*root=最小高度(v,0,5);
在main()中,它尝试推导T的类型,看到第一个参数v的类型是
vector
,并且可以推导出T=int


在前一个问题的另一个例子中,第二个模板参数值不是传递给MyILHead函数的任何类型,它只在返回类型中,但是C++不能从返回值的类型推断模板参数类型,只从传入参数的类型推断出它不能确定什么类型。要使用值,您必须使用

min\u height

明确指定它。在修复未使用的变量后,我在GCC 4.7.2上得到的所有结果是,并非所有
min\u height
路径都返回值。请参阅我前面问题的链接:我找到了!非常感谢!欢迎您。请将我的答案标记为已接受。