Сначала код
#include <stdio.h>
typedef wchar_t* BSTR;
wchar_t hello[] = L"Hello";
class _bstr_t {
public:
operator const wchar_t*() const throw() { return hello; }
operator wchar_t*() const throw() { return hello; }
};
class container {
public:
operator _bstr_t() { return _bstr_t(); }
};
int main()
{
// This gives error (with gcc 4.5.2 at least):
// test.cpp:20:27: error: cannot convert "container" to "wchar_t*" in initialization
wchar_t *str = container();
printf("%S\n", str);
return 0;
}
Проблема здесь в том, что container()
может быть приведен к _bstr_t
, а затем к wchar_t*
, но gcc нет.
Эту проблему можно решить с помощью ручного приведения:
wchar_t *str = (_bstr_t)container();
Но мне нужно избегать ручного приведения, я хотел бы, чтобы gcc выяснил это автоматически.
Мне это нужно, потому что возвращенные объекты типа контейнера будут использоваться в вызовах, таких как
void Func(wchar_t* str);
Func(myObject->Container);
, где я не хочу выполнять приведение вручную.
Я проверил Visual Studio, и он делаетпохоже, тоже не поддерживает такой сценарий.Слишком плохо, но я был бы рад, если бы кто-то мог предложить обходной путь, даже если для этого конкретного случая.
ОБНОВЛЕНИЕ: для тех, кто предлагает оператор wchar_t * для контейнера, , что былопроблема на первом месте.Это будет либо утечка, либо сбой при уничтожении до того, как Func () сможет принять указатель.