- 締切済み
テンプレートクラスのフレンド関数の宣言
テンプレートクラスに対して、operator << を定義しようとしてハマってしまったので。 ---- 最終的にできたコードはこんな感じ ---- template<size_t M> class MyContainer; template<size_t N> std::ostream& operator<<( std::ostream& os, MyContainer<N> const& cont ); template<size_t M> class MyContainer { friend ostream& operator<< <M>( ostream& , MyContainer<M> const& ); <= ここで「operator<<」としてハマった public: MyContainer() { } private: void Print_( std::ostream& os ) const { copy( content_, content_ + M, ostream_iterator<int>( os, "\n" ) ); } private: int content_[M]; }; template<size_t N> ostream& operator <<( ostream& os, MyContainer<N> const& cont ) { cont.Print_( os ); return os; } ------------------------------ テンプレートクラスのfriend関数を宣言する場合に、関数に明示的にテンプレート引数を与えないとテンプレート関数の特殊化だけが friend となるようです。 そういうもんだと言ってしまえばそれまでですが、何故こんな変態的な仕様になってるんでしょう? 特殊化された関数だけをテンプレートクラスのfriend に指定したいような状況が想像できません。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
この場面で MyContainer<M> 以外に対して friend にする意味が理解できないんだけど, それはさておき規格の 14.5.3 を読むと template <size_t N> friend ostream& operator << (ostream &, MyContainer<N> const&); でいけそうな感じがします.
お礼
おぉ。できました。 template<size_t N> と friend を逆にして書いたりしてました。 文法覚えろよ>オレ しかし最初に書いたやつも動くし、よくわからなくなってきたので更に勉強します。。。