Предполагая следующий код.Есть класс MyStream, у которого шаблон перегружен оператором <<.Также есть глобально перегруженный оператор MyStream & operator << (MyStream &, const MyClass &).Непонятно, как генерировать (компилятором) разные методы для двух почти идентичных ситуаций (см. Основную часть функции main ()).Я предполагал, что глобальный оператор должен использоваться в обоих случаях, но это не так.Почему так? </p>
#include <iostream>
class MyStream;
class MyClass;
MyStream& operator << (MyStream& stream, const MyClass&);
class MyStream
{
public:
template <typename T>
MyStream& operator << (const T&)
{
std::cout << __FUNCTION__ << " " << typeid(T).name() << std::endl;
return *this;
}
};
class MyClass
{
};
MyStream& operator << (MyStream& stream, const MyClass&)
{
std::cout << __FUNCTION__ << " " << typeid(MyClass).name() << std::endl;
return stream;
}
int main(int, char**)
{
// 1. Used globally defined operator for MyClass
MyStream() << int() << MyClass();
std::cout << std::endl;
// 2. Template instantiation
MyStream() << MyClass();
std::cin.get();
return 0;
}
Вывод программы, скомпилированной с помощью компиляторов Microsift Visual C ++ 9.0 (x86):
MyStream::operator << int
operator << class MyClass
MyStream::operator << class MyClass