Компилятор MSVS2008 не может найти неявное преобразование типов: не может преобразовать параметр 1 из 'SrcT' в 'DstT' - PullRequest
0 голосов
/ 17 сентября 2011

Почему мой компилятор 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 Ответ

2 голосов
/ 17 сентября 2011

Это не просто VS2008, все компиляторы C ++ ведут себя таким образом.

Для преобразования SrcT в DstT необходимо два преобразования (SrcT-> LPCSTR-> DstT).Однако стандарт C ++ утверждает, что только одно пользовательское преобразование может быть неявно применено к одному значению.

Раздел 12.3, Преобразования

4 Не более одного пользовательского преобразования (конструктор или функция преобразования) неявно применяется к одному значению.

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

См. также этот вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...