2013-03-13 121 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