2010-12-04 4 views
5

ostream演算子をオーバーロードして、テンプレート内の入れ子クラスの出力を許可しようとしています。しかし、コンパイラは実際の関数呼び出しを私のオーバーロードにバインドすることはできません。テンプレート内に入れ子クラスを出力する

template <class T> 
struct foo 
{ 
    struct bar { }; 
}; 

template <class T> 
std::ostream& operator << (std::ostream& os, 
    const typename foo<T>::bar& b) 
{ 
    return os; 
} 

int main() 
{ 
    foo<int>::bar b; 
    std::cout << b << std::endl; // fails to compile 
} 

私はインラインfriend機能として、過負荷を定義する場合、これがコンパイルされます:

template <class T> 
struct foo 
{ 
    struct bar 
    { 
     friend std::ostream& operator << (std::ostream& os, const bar& b) 
     { 
      return os; 
     } 
    }; 
}; 

しかし、私はむしろ、クラスの外に過負荷を定義すると思います。これは可能ですか?

+1

http://stackoverflow.com/questions/4092237/c-nested-class-of-a-template-classを参照してください。 –

答えて

1

番号:-) あなたは既に自分の質問に答えていますが、何とか答えが気に入らないのですか? Johannesは、内部クラスが「推論されていないコンテキスト」であることを説明する投稿にリンクしています。 fooテンプレートの特殊化がある場合、同じ内部バークラスを持つ複数のfoosが存在する可能性があります。コンパイラは、可能なすべてのTsについてfooをインスタンス化しない限り、foo :: barが何であるか把握できません。標準は、それをする必要はないと言います。

フレンドオペレータの元のソリューションで何が問題になっていますか?インラインで定義する必要はなく、ローカルクラス内で宣言するだけで済みます。

関連する問題