2013-03-13 104 views
0

在这种情况下,它是一个二叉树而不是二叉搜索树,模板中只有一个参数是类型T.如主函数中所示,我不需要明确的min_height(v, 0,5),但min_height(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; 
} 
+1

什么是错误? – Pubby 2013-03-13 04:07:39

+1

修复未使用的变量后,我在GCC 4.7.2上得到的所有内容都不是'min_height'的所有路径都返回一个值。 – chris 2013-03-13 04:13:18

+0

请参考我的上一个问题的链接:http://stackoverflow.com/questions/15349589/deducing-template-arguments – diane 2013-03-13 04:15:37

回答

1

因为在一个模板参数T的情况下,你使用的是T中的参数,第一个,矢量& v一个。所以,当编译器看到线

BTNode<int>* root=min_height(v, 0, 5); 
main()中的

它尝试推断T的类型,发现第一个参数v的类型为vector<int>,并且可以推断出T = int。

在上一个问题的另一种情况下,第二个模板参数Value不在传递给min_height函数的任何类型中。它只是在返回的类型中,但是C++不能从返回值的类型推导出模板参数类型,只能从传入的参数的类型中推导出来,所以它不能确定用于Value的类型,而且必须明确指定它使用min_height<int,int>

+0

我明白了!非常感谢你! – diane 2013-03-13 04:27:33

+0

不客气。请将我的答案标记为已接受。 – 2013-03-13 04:29:21