2017-01-25 8 views
0

非テンプレートクラスの内部クラスの存在を必要とします。テンプレート機能は<em>インナー</em>という名前の内部クラスを持っているために、そのテンプレートパラメータタイプ<em>T</em>を必要とテンプレート関数</em> F <em>あります

内側fクラスT :: Innerがインスタンス化されます。

最初に試してください。

// 
// "error: need 'typename' before 'T:: Inner' because 'T' is a dependent scope" 
// 
template <typename T> 
void f(void) 
{   
    T::Inner i; 
} 

私はので、ここで私が間違って何を得ることはありません2回目の試行は、来る、ということを得る:

/// "error: expected ';' before 'i' 
template<typename T> 
void f (void) 
{       
    typename T::Inner I; 
    I i; 
} 

それはなぜですか?

インナーはタイプとして宣言されています。 テンプレートはまだインスタンス化されていません。 タイプインナーが存在するかどうかは、まずインスタンス化の となります。どこが間違っていますか?私はあなたが疑問に持っているものに対し、

typename T::Inner i; 

または

typedef typename T::Inner I; 
I i; 

をしたいと思います

答えて

2

は、実際に使用しようとしていることを右の後、変数であることをIを宣言し、まるでそれが型のように。

+0

作品!どうもありがとうございました。 – elrat

+0

代わりに 'I = typename T :: Inner;'を使っています。そして、btw、IMOのtypenameは 'using'文のRHSには必要ではありません。あなたが持つことができるのは型だけです(あるいは、' decltype'の一部であればコンパイラにとっても明らかですRHSが何であるか)。 – vsoftco

+1

@vsoftco紙を書いて[email protected]に送付してください。 – Brian

関連する問題

 関連する問題