C++ 为什么要实例化流运算符的模板而不是全局重载运算符?
假设有以下代码。有一个类MyStream witch具有模板重载运算符 它首先调用传递C++ 为什么要实例化流运算符的模板而不是全局重载运算符?,c++,operator-overloading,C++,Operator Overloading,假设有以下代码。有一个类MyStream witch具有模板重载运算符 它首先调用传递int()的成员函数,成员函数返回类型为MyStream&的对象,该对象现在可以作为第一个参数传递给free函数(因为它是no更多的右值,它现在是左值),然后调用free函数,将类型为MyStream&的对象作为第一个参数传递,并将MyClass()作为第二个参数传递 这很有趣,这里也发生了类似的事情: 我明白了。谢谢你的澄清。问得好!简短的代码和清晰的问题陈述。我希望这里所有的问题都能像这一个一样清楚地表
int()
的成员函数,成员函数返回类型为MyStream&
的对象,该对象现在可以作为第一个参数传递给free函数(因为它是no更多的右值,它现在是左值),然后调用free函数,将类型为MyStream&
的对象作为第一个参数传递,并将MyClass()作为第二个参数传递
这很有趣,这里也发生了类似的事情:
我明白了。谢谢你的澄清。问得好!简短的代码和清晰的问题陈述。我希望这里所有的问题都能像这一个一样清楚地表达出来!
#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;
}
MyStream::operator << int
operator << class MyClass
MyStream::operator << class MyClass
// 2. Template instantiation
MyStream() << MyClass();
// 1. Used globally defined operator for MyClass
MyStream() << int() << MyClass();