假設下面的代碼。有一流的MyStream女巫模板重載運營商< <。還有全局重載的運營商MyStream &運營商< <(MyStream &,常量MyClass &)。令人困惑的是,爲兩個幾乎相同的情況生成(通過編譯器)不同的方法(請參閱main()函數的主體)。我認爲這兩種情況都應該使用全局運算符,但事實並非如此。爲什麼這樣?爲什麼實例化流操作符的模板而不是全局重載操作符?
#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(86)編譯:
MyStream::operator << int
operator << class MyClass
MyStream::operator << class MyClass
有趣的問題!短代碼和乾淨的問題陳述。我希望這裏的所有問題都和這一個一樣清楚! – Sjoerd 2012-02-18 14:03:31