При написании класса для использования в качестве оболочки вокруг объекта, выделенного из кучи, я столкнулся с проблемой неявного преобразования типов, которая может быть сведена к этому простому примеру.
В приведенном ниже коде класс-оболочка управляет объектом, выделенным в куче, и неявно преобразуется в ссылку на этот объект. Это позволяет передавать объект-оболочку в качестве аргумента функции write (...), поскольку происходит неявное преобразование.
Однако компилятору не удается при попытке разрешить вызов оператора
Итак, (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";
}