2012-03-23 22 views
7

次のコードでは苦労します。基本的に、クラスFooとネストされたクラス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として-not-be-deduced) –

+0

(VC++はおそらくいつものようにスリップさせるはっきりとした 'typename'問題を少なくとも一度は二重に解決する) –

答えて

14

をしかし、それは

func(&foo.bar_); 
だけの問題ではありません

も必要です

func<int>(&foo.bar_); 

これは、テンプレート関数 "func"を呼び出しているが、その型を推測できないためです。その型がなければ、それはエラーになりますように

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

+1をご覧ください。正解。より大きな問題は、「T」を推論することができないため、明示的に渡す必要があることです。 – Nawaz

+2

+1「深い」答えを与える新人が好きです!実際、ここで「T」を推論することができないという事実は**非deducibleなコンテキスト**として知られています。 –

3

それはdependent nameだ、あなたが言う必要があります:あなたは次のシグネチャ

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

を持っている必要があります

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

Downvoterはコメントしますか? – Flexo

+0

-1。この回答は不完全であり、問​​題の大きな問題を解決しません。あなたが言ったことは真実ですが、 'func(&foo.bar_)'はどのように機能しますか?それはまだありません。 – Nawaz

+0

@ Nawaz:私の答え – josephthomas

関連する問題