ostream オーバーロードを理解しようとしています。このことを考慮
#include <iostream>
using std::ostream;
enum class A{a1, a2, a3};
template <class T>
ostream& operator<<(ostream& out, const T& a)
{
switch(a)
{
case T::a1 :
return out<<"a1";
case T::a2 :
return out<<"a2";
case T::a3 :
return out<<"a3";
};
return out;
}
/*ostream& operator<<(ostream& out, const A& a)
{
switch(a)
{
case A::a1 :
return out<<"a1";
case A::a2 :
return out<<"a2";
case A::a3 :
return out<<"a3";
};
return out;
}*/
int main()
{
A a = A::a3;
std::cout<<a<<std::endl;
}
コンパイル中に次のようなエラーが発生します
test.cpp:13:17: error: ambiguous overload for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream<char>}’ and ‘const char [3]’)
return out<<"a1";
^
通常の機能のコメントを外し、テンプレートバージョンにコメントを付けると正常に機能します。あいまいさが通常の機能にない理由と、テンプレート化されたバージョンにある理由