2011-09-16 51 views
0

爲什麼我MSVS2008編譯器不能找到隱式類型轉換SRCT - 調用函數時> DSTT - > LPCSTR?這在其他情況下工作正常。我不喜歡隨時編寫手動轉換,如下所示:MyFunc((LPCSTR)src)。我錯過了什麼?MSVS2008編譯器不能找到隱式類型轉換:無法從「SRCT」轉換參數1「DSTT」

MyFunc(src); 

1> d:\測試\ TEST.CPP(39):錯誤C2664: 'MYFUNC':不能從 'SRCT' 來轉換參數1 '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

我不知道答案,但我可以說用g ++ errs編譯的類似程序:「x.cc:40:錯誤:從'SrcT'轉換爲非標量類型'DstT'請求」 –

回答

2

這不只是VS2008,所有的C++編譯器都是這樣。

兩次轉換是必要的,一個SRCT轉換爲DSTT(SrcT-> LPCSTR-> DSTT)。但是,C++標準規定只有一個用戶定義的轉換可以隱式應用於單個值。

12.3節,轉化也this question

4 At most one user-defined conversion (constructor or conversion function) is implicitly applied to a single value.

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

見。

+0

奇怪的是,在** DST2 = SRC需要隱式轉換的我的理解數量; **和** MYFUNC(SRC); ** 是一樣的。 第二個具有PARAM如DSTT,即DSTT的新實例,必須內聯從SRCT創建這是幾乎等同於調用如下 - MYFUNC((DST2 = SRC)) - 和編譯罰款。 – Sergey

相關問題