2009-11-02 122 views
1

假設我有一個具有某個模板類型的成員變量的對象。所以,在類的聲明,就不會有這樣的事情:爲什麼模板類型的初始化需要重複變量的類型?

// This is just the declaration of bar which is a member of some class. 
templatizedType<Foo> bar; 

現在,當我想初始化bar爲什麼我要做

// This is the initialization. Note that I am assuming that templatizedType has a 
// constructor that takes an argument of type T*. Presumably, this is happening 
// somewhere inside whatever class has declared bar as a member. 
templatizedType<Foo> bar(new Foo()); 

,而不是簡單地

bar(new Foo()); 

編輯(試圖澄清):從本質上講,在我看來,酒吧的類型(包括參數化類型)已經在它的聲明中作爲類的成員進行了拼寫因此在初始化時不需要重複。

如果這一切都沒有意義,讓我知道(我發現這主要是通過反覆試驗和對IRC有幫助的人,所以如果我對這裏發生的事情的理解是錯誤的,那麼幫助也會不勝感激。)

+0

是「酒吧」的一類或哪方面你一個成員變量申報和使用吧? – 2009-11-02 19:54:47

+1

這絕對是錯的 - 你不應該重複變量聲明。粘貼一個完整的樣本。 – 2009-11-02 19:54:55

+0

你的意思是在這裏說'TemplatizedType '有一個構造函數,它把'T *'作爲參數,並且你想從參數中推導出'T'來傳遞給構造函數? – 2009-11-02 20:01:12

回答

2
templatizedType<Foo> bar; 

調用默認的構造函數,而

templatizedType<Foo> bar(new Foo()); 

調用構造採取一個Foo *作爲第一個參數 要構造一個對象,你寫的類型。 這就是爲什麼,

bar(new Foo()) 

不叫templatizedType的構造函數,而是調用類型的已構建對象的方法。這種方法可能是,例如:

void operator()(Foo*) 

希望這有助於..

1

由於C++是一種強類型語言,它要確保你指的是真正的這個「吧」的事情是什麼可以接受「新的Foo()」因此,你需要給它一個類型,如行:

templatizedType<Foo> bar(new Foo()); 

此外,如果你只是說

bar(new Foo()); 

誰會說這不是一個函數bar()vs變量聲明?

0

你確定你不只是超載名稱bar在你的構造,即如果你的類被稱爲A一個局部變量,你做的

A::A() 
    : bar(new Foo()) 
{ 
} 
0

A::A() 
{ 
    templatizedType<Foo> bar(new Foo()); 
} 

代替原因在於,解決模板化函數的重載問題已經很難了,而不需要處理部分專業化和模板模板成員的問題(我知道這聽起來很混亂,令人困惑。)

基本上,確定當你有這個叫什麼:

void foo (int i); 
template <typename T> void foo (T t); 

比搞清楚輕鬆了許多,當你有這個叫什麼:

template <typename T> class foo { 
    foo (T t); 
    template <typename U> foo (U u); 
}; 

對構造的可能性是對於功能模板來說,通過一些啓發式方法來解決問題的能力太大了,所以標準根本不會嘗試(在我看來這是正確的調用)。相反,模板化類型可以提供make_****函數(想象中的make_pair),它們用作模板構造函數。

0

我認爲最好你能希望有一個聲明,如

TemplatizedType<> bar(new Foo()); 

但這種推論是不會發生的。我想最大的原因是編譯器首先需要知道哪個TemplatizedType實例化,然後才能檢查哪些構造函數。

用的C++ 0x,你將能夠結合make_xxx函數推斷與自動關鍵字模板參數:

auto bar = make_templatized_type(new Foo()); 
相關問題