2010-01-31 138 views
0

如果我有一個模板類和模板函數這樣C++模板類和模板函數

template <class T> T getMax (T a, T b) { 
    return (a>b?a:b); 
} 

template <class T> class GetMax { 
public: 
    static T getMax(T a, T b) { 
     return (a>b?a:b); 
    }  
}; 

爲什麼這些無效?

x=getMax(1, '2');    

但這些都是有效的

x=getMax(1,2); 

這是否意味着存在模板函數沒有類型轉換?

這是無效的

x=GetMax::getMax(1, 2); 

這是否意味着爲模板類,必須指定類型?

+0

該標準本身有一個類似於你的第二個問題。 'std :: pair '必須指定其類型。這就是爲什麼有'std :: make_pair (T1,T2)'功能。 – MSalters 2010-02-01 12:03:12

回答

3

getMax(1, '2');應該返回什麼?一個int或char?想想吧:)

你可以寫:

template <class T1, class T2> T1 getMax (T1 a, T2 b) { 
    return (a>b?a:b); 
} 

但請注意,您明確返回類型1,什麼可能不會像getMax('1',1000)的情況下工作,因爲100將被轉換爲char類型,而將不夠大。

後者是無效的,因爲要使用一個類,你必須首先說明它是什麼類型 - 這種機制首先行爲,然後再扣除類型。

,如果你說這它的工作:

class GetMax { 
public: 
    template <class T> 
    static T getMax(T a, T b) { 
     return (a>b?a:b); 
    }  
}; 
+0

我的意思是爲什麼'2'不能隱式轉換爲int? – skydoor 2010-01-31 21:17:28

+0

@skydoor,編譯器應該如何知道是否要返回一個'char'或者'int'? – 2010-01-31 21:19:58

+0

@skydoor,可能會問同樣的問題,爲什麼'1'不能隱式轉換爲char? – 2010-01-31 21:20:34

2

1)有類型轉換,但它不與類型推斷一起工作。當你指定類型時(例如getMax<int>(1,'2')getMax<char>(1,'2')),它的含義是,但如果你不這樣做,編譯器無法推斷出你想要的是getMax<int>還是getMax<char>

2)是的,只有函數模板而不是類模板纔會推斷模板參數。