首先是代码
#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,它似乎也不支持这种情况。太糟糕了,但如果有人可以提供解决方法,我会很高兴,即使是针对这种特定情况。
更新:对于那些建议在容器上使用 operator wchar_t* 的人,那首先是问题所在。这将在 Func() 有机会接受指针之前被销毁时泄漏或崩溃。
最佳答案
进行隐式转换时,最多一个 可能发生的用户定义转换。在这个问题上,MSVC 行为不符合标准。
C++11(12.3 转换):
At most one user-defined conversion (constructor or conversion function) is implicitly applied to a single value.
要使隐式转换起作用,container
必须直接转换为 wchar_t*
。
关于c++ - gcc 深/双/嵌套类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8819102/