2010-05-13 17 views
1

包括 「stdafx.h中」

#include<iostream.h> 

template<class T> 
class Sample 
{ 
    public: 
     Sample(); 
     static int i; 



}; 
template<class T> 
int Sample<T>::i = 0; 
template<class T> 
Sample<T>::Sample() 
{ 
    i++; 
    cout<<i; 
} 

void main() 
{ 
    Sample<int>s1; 
    Sample<float>s2; 
    Sample<char>s3; 
} 

輸出:111我出門的原因是111?

的是我得到了看跌的理由是111?

+0

今後,請選擇它並單擊編輯器中的「101010」按鈕格式化你的代碼。 – 2010-05-13 11:48:01

+1

是的,3個ace。你期望什麼? – 2010-05-13 11:50:27

+1

你期望得到什麼? – 2010-05-13 11:50:58

回答

1

Sample<int>::i,Sample<float>::iSample<char>::i是三個不同的變量。因此,你得到111.

1

Sample是一個類模板,用於在這種情況下創建三個不同的類,每個類都有其自己的不同i

7

的原因,輸出是111(相對於123)是Sample<int>Sample<float>Sample<char>三種完全不同的類型,因此,它們各自具有它們自己的,獨立的靜態變量稱爲i

您有一個名爲Sample的模板,每次您使用不同的模板參數對其進行實例化時,它都會根據模板使用該模板即時創建新類。但使用該模板創建的類彼此之間沒有關係,並且不共享靜態信息。

0

當你有一個帶有靜態成員變量的模板類時,編譯器應該確保對於「每個」類型名稱T,只有一個靜態變量副本。由於您已經使用三種不同類型實例化Sample類,因此每種類型的輸出都顯示爲「1」。

0

Sample<int>,Sample<float>,Sample<char>是三種不同的類型,每個都有自己的靜態變量。

如果你想得到123你不得不把static int i在一個共同的基類。

2

嘗試添加線

Sample<float> s2_2; 

main()(其應返回int,捎帶)。這應該有助於說明其他人已經回答了什麼。

此外,您可以在您的輸出類型的信息:

#include <typeinfo> 
: 
: 
template<class T> 
Sample<T>::Sample() 
{ 
    i++; 
    std::cout << typeid(T).name() << ':' << i << std::endl; 
}