2012-03-23 77 views
7

我正在努力處理以下代碼。基本上,我有一個類Foo和嵌套類Bar,現在我想將Bar類對象的指針傳遞給一個函數,但它不能編譯。任何人都可以幫助我嗎?謝謝。以模板類爲參數的C++模板函數

template <typename T> 
struct Foo 
{ 
    struct Bar 
    { 
     T data_; 
    }; 
    Bar bar_; 
}; 

template <typename T> 
void func(Foo<T>::Bar* bar) // Why is this line wrong??? 
{ 
} 

int main() 
{ 
    Foo<int> foo; 
    foo.bar_.data_ = 17; 
    func(&foo.bar_); 
    return 0; 
} 
+0

的可能重複的[C++,模板參數不能推斷](http://stackoverflow.com/questions/6060824/c-template-argument-can - 不可推論) – 2012-03-23 20:03:39

+0

(至少,重複一次解決顯而易見的'typename'問題,哪個VC++可能會像往常一樣滑倒) – 2012-03-23 20:04:06

回答

14

您需要具有以下特徵

template <typename T> 
void func(typename Foo<T>::Bar* bar) // Why is this line wrong??? 

然而,這並不是唯一的問題

func(&foo.bar_); 

也需要

func<int>(&foo.bar_); 

這是因爲您正在調用模板函數「func」,但其類型無法推導出來。沒有它的類型,它會給出一個錯誤,如

no matching function for call to 'func(Foo<int>::Bar*)' 
+2

+1。正確答案。更大的問題是:'T'不能被推斷出來,所以需要明確傳遞。 – Nawaz 2012-03-23 17:30:56

+2

+1我喜歡新人給予「深刻」的答案!僅供參考,「T」不能在這裏被推斷的事實被稱爲**不可推論的上下文**。 – 2012-03-23 20:03:17

3

這是一個dependent name,你需要說:

template <typename T> 
void func(typename Foo<T>::Bar* bar) // Tell the compiler explicitly it's a type 
+2

Downvoter care care to comment? – Flexo 2012-03-23 17:26:17

+0

-1。這個答案是不完整的,並不能解決問題中的更大問題。你說的是真的,但'func(&foo.bar_)'將如何工作?它仍然不會。 – Nawaz 2012-03-23 17:28:05

+0

@ Nawaz:請參閱我的回答 – josephthomas 2012-03-23 17:29:19