为什么我的MSVS2008编译器无法找到隐式类型转换SrcT - > LPCSTR - > DstT调用函数时?这在其他情况下工作正常。我不喜欢一直编写手动转换,如下所示:MyFunc((LPCSTR)src)。我缺少什么?
MyFunc(src);
1> d:\ test \ test.cpp(39):错误C2664:'MyFunc':无法将参数1从'SrcT'转换为'DstT'
#include <windows.h>
#include <tchar.h>
class SrcT
{
public:
operator LPCSTR() const
{
return "dummy";
}
};
class DstT
{
public:
DstT() : m_value(NULL) {};
DstT(LPCSTR value) {m_value = value; }
DstT& operator=(LPCSTR value) { m_value = value; return *this; }
LPCSTR m_value;
};
void MyFunc(DstT dst)
{
}
int _tmain(int argc, _TCHAR* argv[])
{
SrcT src;
DstT dst(src);
DstT dst2;
dst2 = src;
MyFunc((LPCSTR)src);
MyFunc(src);
return 0;
}
答案 0 :(得分:2)
不仅仅是VS2008,所有的C ++编译器都是这样的。
将SrcT转换为DstT(SrcT-> LPCSTR-> DstT)需要两次转换。但是,C ++标准规定只能将一个用户定义的转换隐式应用于单个值。
第12.3节,转换
4最多一个用户定义的转换(构造函数或转换 function)隐式应用于单个值。
class X { // ...
public:
operator int();
};
class Y { // ...
public:
operator X();
};
Y a;
int b = a; // error: a.operatorX().operator int() not tried
int c = X(a); // OK: a.operatorX().operator int()