次のコードで、「ifdef TEST」で区切られたコードが有効になっている場合、列挙を文字列として出力するために定義した operator<< 関数が使用されない理由を説明してください。私の問題を引き起こしているコードは、特に問題のコードが別のクラス (Container2) を参照しているため、Container クラスの列挙型の出力とは無関係であるように思われます。
g++ filename.cpp でビルドすると、出力は次のようになります。
Print for Container: mycolor is red
g++ -DTEST filename.cpp でビルドすると、出力は次のようになります。
Print for Container: mycolor is 0
コードは次のとおりです。
namespace mynamespace
{
enum color {red, blue};
}
namespace mynamespace
{
class Container
{
public:
mynamespace::color mycolor1;
explicit Container() : mycolor1(mynamespace::red) {};
std::ostream &Print(std::ostream& os) const;
};
class Container2
{
};
}
std::ostream & operator<<(std::ostream &os, const mynamespace::color &_color);
namespace mynamespace
{
#ifdef TEST
// If this is defined, the printing of the enum in Container does not use the operator<< function to output the enum as a string
std::ostream& operator<<(std::ostream &os, const Container2 &i);
#endif
}
int main()
{
// Create a Container. Default color is red
mynamespace::Container *container = new mynamespace::Container;
container->Print(std::cout);
}
std::ostream & mynamespace::Container::Print(std::ostream &os) const
{
os << "Print for Container: mycolor is " << mycolor1 << std::endl;
return os;
}
std::ostream& operator<<(std::ostream &os, const mynamespace::color &_color)
{
switch(_color)
{
case mynamespace::red: os << "red"; break;
case mynamespace::blue: os << "blue"; break;
default: os << "unknown"; break;
}
return os;
}