MSVS2008编译器找不到隐式类型转换:无法将参数1从'SrcT'转换为'DstT'

时间:2011-09-16 21:45:36

标签: c++ type-conversion

为什么我的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;
}

1 个答案:

答案 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()

另见this question