• 締切済み

テンプレートクラスのフレンド関数の宣言

テンプレートクラスに対して、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 に指定したいような状況が想像できません。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

この場面で MyContainer<M> 以外に対して friend にする意味が理解できないんだけど, それはさておき規格の 14.5.3 を読むと template <size_t N> friend ostream& operator << (ostream &, MyContainer<N> const&); でいけそうな感じがします.

koko_u
質問者

お礼

おぉ。できました。 template<size_t N> と friend を逆にして書いたりしてました。 文法覚えろよ>オレ しかし最初に書いたやつも動くし、よくわからなくなってきたので更に勉強します。。。

関連するQ&A