次のような汎用ストリーム演算子を実装したいベクトルクラスがいくつかあります。
template <typename T>
std::ostream& operator<<(std::ostream& os, const T& v)
{
for (int i = 0; i < T::num_elems; ++i)
{
os << " " << v.a[i];
}
return os;
}
os << " " << ...
あいまいなので、もちろんエラーが発生することを除いて、これはほとんど機能します。これを明確にして、ここで<<
演算子を強制的std::
に使用するにはどうすればよいですか?
または、このテンプレート化されたストリーム演算子の使用をベクター クラスだけに制限するにはどうすればよいですか? ベクトル クラスとストリーム オペレータを別の名前空間に配置しましたが、それだけでは十分ではないようです。
実際のエラー メッセージの始まり:
foo.cpp:73: error: ambiguous overload for 'operator<<' in 'os << " "'
/usr/include/c++/4.2.1/ostream:169:0 /usr/include/c++/4.2.1/ostream:169: note: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char, _Traits = std::char_traits<char>] <near match>
/usr/include/c++/4.2.1/ostream:177:0 /usr/include/c++/4.2.1/ostream:177: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>] <near match>
/usr/include/c++/4.2.1/ostream:185:0 /usr/include/c++/4.2.1/ostream:185: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char, _Traits = std::char_traits<char>]
...
さらなる明確化: ストリーム演算子はテスト ハーネス (UnitTest++) でのみ使用されており、パブリック API の一部ではありません。また、ベクター クラスは、C++ のベクターではなく、小さなカスタムの固定サイズのベクター (実際には単純な配列) です。
これを操作するために必要なベクトル クラスの 1 つの簡略化された例:
struct VectorClass {
enum { num_elems = 16 };
int32_t a[num_elems];
};