2009-06-14 10 views
0

テンプレートクラスの任意のバージョンを受け入れる関数を作成する方法はありますか?テンプレートクラスを引数として使用する

これは動作します:

ostream& operator << (ostream &out,const Vector<int>& vec); 

が、これはそうではない:

ostream& operator << (ostream &out,const Vector& vec); 

は、それが二行目は、ベクターのいずれかのバージョンのために何とか仕事を得ることは可能ですか?例: vector<int>vector<double> 2つの別々の関数を書く必要はありませんか?質問に追加

あなたが提案してきたように私はOP < <テンプレート関数を作りました。それ私はVectorクラスの定義に以下を追加してみましたが、それはうまくいきませんでしたベクトルクラスのフレンド関数にするために:

friend ostream& operator << (ostream &out, const Vector<T>& vec); 

任意のアイデア何がそれを修正するために行うことができますか?

+2

クラスの定義を編集したり、そこに友情を指定したりせずに、クラスの機能を友人にすることはできません。 オペレータが友人機能であることを必要とするオペレータで達成しようとしていることを指定できますか?おそらく友情は必要ありません。 –

答えて

1

としては、すでに動作するはずです。このような何かを指摘しましたこのように:

template <typename T> 
ostream& operator << (ostream &out,const Vector<T>& vec) { 
    vec.print_on(out); 
    return out; 
} 

しかし、通常、私はあなたのVectorクラスに間違いを見せるために、クラスの内部へのアクセスを必要とするこのような出力演算子を考えるでしょう。実際には、表示を行うためにパブリックインターフェイスを使用する必要があります。

他の事はあなたにも、あなたがその型を維持できるように、出力ストリーム自体をテンプレートにしたいかもしれないということです。

template <typename O, typename C, typename T> 
std::basic_ostream<O, C>& operator << (std::basic_ostream<O, C> &out,const Vector<T>& vec) { 
    vec.print_on(out); 
    return out; 
} 

Vectorprint_onはまだostreamを使用することができます。

+0

+1です。あなたは、通常、友人である必要がない演算子<<()についても正しいです。 –

5

確かに、それをテンプレート関数を作る:それは、最も簡単に処理され、友人の要件については

template <typename T> 
ostream& operator << (ostream &out,const Vector<T>& vec) { 
    // body here 
} 

template <typename T> 
ostream& operator << (ostream &out,const Vector<T>& vec); 
+1

関数本体をインライン化する可能性が最も高いのは、 –

2
template <class T> 
ostream& operator << (ostream &out,const Vector<T>& vec); 
関連する問題