2014-11-15 52 views
2

比方說,我有一個類模板:瞭解C++模板方法定義語法

template <typename T> 
class Array { 
    ... 
    int length() const; 
}; 

length的定義是

template <typename T> 
int Array<T>::length() const 
{ 
    ... 
} 

但是,爲什麼不會有呢? (I)

int Array<T>::length() const 
{ 
    ... 
} 

或者可能:(II)

template <typename T> 
int Array::length() const 
{ 
    ... 
} 

我猜(II)將是一個函數模板。但實際上我無法理解這個語法背後的邏輯。任何規則來理解模板語法?

回答

1

爲什麼就不能(I)很簡單:沒有template線,編譯器將別無選擇,只能解釋<爲小於運算符,這將肯定不會導致一個有用的功能定義。

對於(II)我們需要考慮如何表示類模板的函數模板。說你的班級是這樣的:

template <typename T> 
class Array { 
    ... 
    template <typename U> 
    int length() const; 
}; 

現在你需要能夠明確指定哪個組件需要哪個模板參數。在沒有明確指定<T><U>的情況下,您至少會有一些混淆關於哪個參數適用於哪個模板。在最壞的情況下,它會模糊不清。

0
template <typename T> 
int Array::length() const 

可能存在部分模板特化。編譯器應該如何知道這是主模板成員的定義還是部分專業化?

int Array<T>::length() const 

C++中的每個名稱都必須聲明。 T,如果要用作模板參數,還必須聲明爲一個。你沒有,因此編譯器會查找更早的聲明併發出錯誤消息,因爲他沒有發現。

2
int Array<T>::length() const 
{ 
    ... 
} 

非法的,如果:

  • 你還沒有宣佈一個名爲T
  • 類,你還沒有使用的typedef給現有類型的新名稱 - T

例如:

class T; 
typedef double T; 
using T = double; 

template <typename T> 
int Array::length() const 
{ 
    ... 
} 

非法的,如果:

  • 你沒有一類叫做Array - 不同template <class T> Array