2012-03-19 63 views
0

以下代碼可正常工作。隱式轉換爲用戶定義類型

class A 
{ 
    private: 
    int _value; 
    public: 
    class AProxy 
    { 
    public: 
    AProxy(int num):_num(num){} 
    int _num; 
    }; 
    A(AProxy x):_value(x._num){} 
    int getvalue(){ 
     return _value; 
    } 
}; 

void func(A a) 
{ 
    cout<<"A is initialized with "<<a.getvalue()<<endl; 
} 

int main() 
{ 
    A a(10); 
    return 0; 
} 

一個(10)被轉換爲(Aproxy(10))

然而,下面的代碼不工作。

class A 
{ 
    private: 
    int _value; 

    public: 
    class AProxy 
    { 
    class AAProxy 
    { 
    public: 
    AAProxy(int num):_aanum(num){} 
    int _aanum; 
    }; 
    public: 
    AProxy(AAProxy aa):_num(aa._aanum){} 
    int _num; 
    }; 
    A(AProxy x):_value(x._num){} 
    int getvalue(){ 
     return _value; 
    } 
}; 

void func(A a) 
{ 
    cout<<"A is initialized with "<<a.getvalue()<<endl; 
} 

int main() 
{ 
    A a(10); 
    return 0; 
} 

a(10)→a(Aproxy(AAproxy(10)))。那麼從int到用戶定義類型的隱式轉換隻發生一次?

+1

你的兩個代碼段是相同的。這是怎麼回事? – 2012-03-19 17:52:03

+1

你的代碼中沒有叫做'AAproxy'。也沒有隱式轉換運算符,你有什麼是轉換*構造函數*。 – Jon 2012-03-19 17:52:44

+0

對不起。有一個複製粘貼錯誤。現在檢查代碼。 – vamsi 2012-03-19 17:53:49

回答

2

它只查找從類型A(它是什麼)到類型B(它應該是什麼)的直接轉換。如果要這樣做,並且問題變得無界,那麼從A到C轉換爲B的方式有很多種方法;更不用說那種模棱兩可很快就會出現這種方式。

0

您會得到最隱含的用戶定義轉換。

1

根據C++標準,該語言只會嘗試用1級隱式轉換解決用戶類型斷開連接。 > 1級需要顯式轉換。