2011-07-19 13 views
10

私は内側のユーティリティクラスでテンプレートクラスを作成しています。テンプレートのすべての特殊化は、同じ内部クラスたい:テンプレートクラスの内部クラスを非テンプレートクラスにすることはできますか?

template<...> class Outer { 
    class Inner { }; 
}; 

Outer<...>::Innerを与えますが、私はちょうど書かれただろうかのように私は、すべてのInnerは同じタイプになりたい:

class Inner { }; 
template <...> class Outer { }; 

場合、または

class Outer { 
    class Inner { }; 
}; 

Outer::Innerを与える:Outerは、単純に、テンプレートクラスではありませんでした。可能であれば、Outer::InnerがすべてOuter<>のために働くようにしたいと思っています(名前空間/明快な理由のみ)。そうでなければ、私はちょうどInnerを移動することができます。

+1

を私はかなり確信している答えはノーですが、私は誰かが私ので、私が間違っていることを証明願っています似たような状況に陥ってしまいます:) –

+1

私はまったく公然と答えていますが、私は賢明な回避策も望んでいます... –

答えて

15

ネストされたクラスは非テンプレートでもかまいませんが、テンプレートのインスタンス化はすべて、独自のネストされたクラスを持ちます。あなたはできます

namespace detail { 

class Inner {}; 

} // detail 

template<...> 
class Outer { 
    typedef detail::Inner Inner; 
}; 
+0

清潔でセクシーな解決策 –

+0

私の名前空間の詳細を忘れています - class Inner'は隠されています、今、それは "真の"内部クラスのようですか?それともコードを含むものはそれを持つことができるでしょうか? – Nate

+0

@Nate上記は 'typedef'のように動作します。 'Inner'は宣言だけでは不完全なままになります。宣言はそれが意味するすべての警告とともに、定義(class Inner;)ではありません。しかし、それは宣言されなければなりません( 'detail :: Inner'は何かを参照する必要があります)、そうでないと' typedef'dできません。 –

0

これは、Outerのインスタンスごとに一意になります。すなわち、

Outer<int>::Inner will be a different type from Outer<double>::Inner 
+1

その事実は彼が彼の問題で明確に述べているので、OPによく知られています –

13

私は過去にこれをやった方法は、継承使用している:

class DummyBase{ 
protected: 
    class Inner{ 
     //etc... 
    }; 
}; 

template<...> class Outer : public DummyBase{ 
    //etc... 
}; 
+0

+1これは賢いですが、私はLucの答えがもっと好きです。 –

+1

+1です。これは 'Outer <> :: Inner'を実際のクラス名にするためです。だから 'class Outer <> :: Inner x;'または 'friend class Outer <> :: Inner;'はまだ動作しますが、 'typedef'ソリューションはそこで失敗します。 –

関連する問題