在编写一个类以充当堆分配对象的包装器时,我遇到了隐式类型转换的问题,可以简化为这个简单的示例。
在下面的代码中,包装类管理一个堆分配的对象并隐式转换为对该对象的引用。这允许包装器对象作为参数传递给函数 write(...),因为发生了隐式转换。
但是,当尝试解析对 operator<<(...) 的调用时,编译器会失败,除非进行了显式转换(使用 MSVC8.0、Intel 9.1 和 gcc 4.2.1 编译器进行检查)。
那么,(1)为什么在这种情况下隐式转换会失败?(2)它可能与依赖于参数的查找有关吗?(3) 如果没有明确的演员表,有什么可以做的吗?
#include <fstream>
template <typename T>
class wrapper
{
T* t;
public:
explicit wrapper(T * const p) : t(p) { }
~wrapper() { delete t; }
operator T & () const { return *t; }
};
void write(std::ostream& os)
{
os << "(1) Hello, world!\n";
}
int main()
{
wrapper<std::ostream> file(new std::ofstream("test.txt"));
write(file);
static_cast<std::ostream&>( file ) << "(2) Hello, world!\n";
// file << "(3) This line doesn't compile!\n";
}