2012-05-31 63 views
1
template<typename T> class A // template parameterization 
{ 
    private: 
     T t; 
    A(const T& v) : t(v) {} 
}; 

class B 
{ 
    template<typename T> 
    B(const T& v) 
    { 
     std::cout << v << std::endl; 
    } 
}; 

// usage of A and B 
A<int> a; 
B  b(10); 

問題>在什麼情況下,我們必須提供模板參數才能定義類變量。當我們需要提供模板參數來定義一個類時?

例如,

如果類包含模板成員變量或?

謝謝

回答

3

如果類是類模板,您必須提供模板參數來創建實例。在你的例子中,class A是一個類模板,而class B不是。

類模板:

template <typename T> class A {}; 

不是一類的模板:

class B { 
    // code may include function template, etc. 
    // but the class itself is not a class template 
}; 

在您的例子,class B具有模板構造函數和參數可以由編譯器使用,以確定哪些專業化使。所以在這種情況下,因爲字面10int生成構造相當於

B(const int&); 

。構造函數不像函數,所以這隻有在編譯器能夠確定什麼是T時才能使用。有關更多詳細信息,請參閱this related question

+0

+1爲了將它放在一起比我可以更好的單詞。您還可以添加一個細節,爲什麼在第二種情況下創建對象時不需要指定類型,儘管構造函數是模板函數。現在看Q,我認爲這是Q. –

+0

@Als的目的,我試圖在編輯時解釋後一點。它很複雜,因爲在構造函數的情況下,不能告訴編譯器T是什麼...... – juanchopanza

+0

確切地說,OP就是這樣。在我發佈之後,我意識到這一點非常重要,但是看到你的回答比我的好得多,如果解釋詳細信息,可能會更好。就是說,你已經擁有了我的+1。 :) –

相關問題