2014-10-28 63 views
0
#include <string> 
#include <iostream> 

using namespace std; 

template <class T> 
class Tyler{ 
    T first, second; 
    public: 
     Tyler(T a, T b) 
     { 
      first = a; 
      second = b; 
     } 
     int larger(); 
     string larger(); 

}; 

template <class T> 
int Tyler<int>::larger() 
{ 
    cout << "int larger" <<endl; 
    return(first>second?first:second); 
} 

template <class T> 
string Tyler<string>::larger() 
{ 
    cout << "string larger" <<endl; 
    if(first.compare(second) > 0) 
     return(first); 
    return(second); 
} 

int main() 
{ 
    Tyler<int> tobj(7,77); 
    Tyler<string> tstr("Seven", "test"); 

    cout << tobj.larger() <<endl; 
    cout << tstr.larger() <<endl; 

} 

我正在學習C++(特別是模板)並試圖理解。如果我想在下面創建兩個函數,並且「較大」函數將執行不同,取決於在main中實例化的類中指定的數據類型。我只看到使用int和float的例子。C++模板int和字符串

+0

你想創建取決於給它的類型執行操作的功能? – MtRoad 2014-10-28 00:28:32

+0

模板類中不需要兩個'greater()'函數,只有一個:'T greater()'。注意,返回類型是'T',這是完全正確的。在實現中:從專業化中拋棄'class T'。 – Notinlist 2014-10-28 00:31:21

+0

@MrRoad是的我想創建兩個更大的函數,每個函數都會根據給定的數據類型做不同的事情。 – 2014-10-28 00:39:46

回答

0

首先,你似乎試圖專門化該函數,所以你的聲明是不正確的。你應該有這個聲明。

T larger(); 

希望每個Tyler對象只有一個larger功能,即做不同的事情取決於T。接下來,定義:

int Tyler<int>::larger() 

在這裏,你正在創建一個模板專業化。這是一個模板函數(當然,排序的),所以它需要template位之上,但這種專業化要求沒有模板參數,所以......

template<> 
int Tyler<int>::larger() 

這是爲什麼有用嗎?嗯,因爲有時一個專業化可以有模板參數...

template<class T, class Allocator> 
vector<T,Allocator> Tyler< vector<T,Allocator> >::larger() 
+0

我將如何去定義這些功能? 'int large();'和'string greater();'編譯器抱怨template.cpp:16:10:error:'std :: string Tyler :: larger()'不能重載 模板。 cpp:15:7:error:with'int Tyler :: larger()'' – 2014-10-28 00:55:15

+1

@TylerBrown:這是因爲你的模板定義聲明'int large();'和'string greater();'無論模板參數如何。如果你想讓不同的特化返回不同的類型,把它改爲單個'T larger();'。 – 2014-10-28 01:04:47