2016-06-29 11 views
0

次のコードはうまく構築されますが、オーバーロードされたテンプレート演算子は呼び出されません。何故ですか? main()ファンクションはxの代わりに120を出力します。入れ子型のオーバーロード演算子

#include <iostream> 

namespace foo 
{ 
    struct bar 
    { 
     enum Type { x = 'x', y = 'y' }; 
    }; 
    template<typename T> std::ostream& operator<<(std::ostream& s, typename T::Type o) { return s << char(o); } 
} 

int main() 
{ 
    foo::bar::Type t{ foo::bar::x }; 
    std::cout << t; 
} 

答えて

1

コンパイラは、タイプTが(その上の多くのためthis質問をチェックアウト)テンプレートをインスタンス化するためにすることになっているものを把握することはできません。

std::ofstream & operator<<(std::ostream & s, bar::Type t){...} 

enumあなたが宣言したがbarに公開されているので、この場合には心配する必要はへのアクセス制限はありません。ただ、これを行います。

+0

私の実際のコードには、それらに定義されている型enumを持つ複数のクラスがあります。私はそれらのすべてのために演算子<<を定義する必要がないようにしたい。 – BlindDriver

+0

@BlindDriverなぜそれが動作しないのかを理解したい場合は、タイプ控除を読み上げる必要があります。コードの重複を最小限に抑えるためにマクロを書くか、一度に1つずつ書き出す必要があります。 – SirGuy

+0

はい、あなたが参照した投稿を読み、私のコードがうまくいかない理由を見ました。私はちょうど代替があることを望んでいた。とにかく助けてくれてありがとう! – BlindDriver

関連する問題