2012-09-28 53 views
2
int main() { 

class A { 
    public: 
    static double test_code(const A& a); 
    }; 

    class B : public A { 
    public: 
    B(int i) { }; 
    static double test_code2(const B& b); 
    }; 

A::test_code(2); 
B::test_code2(2); 

return 0; 

} 

CF:http://ideone.com/ilfE8這樣的演員可能嗎?

第一個方法調用不會編譯,而第二意願。有什麼方法可以使此轉換工作?感謝

+6

你可以在main中聲明一個類嗎? –

+1

你期待什麼轉換成什麼? –

+1

「有什麼方法可以使此轉換工作?」從「2」轉換爲「A」?如果沒有指定具有相關構造函數作爲參數的派生類型(例如'B(2)')或'A'中的相關構造函數, – user1201210

回答

2

不,不能用於隱式類型轉換完成。這有多個原因,更簡單的是,爲了成爲一個選項,編譯器必須在調用的地方知道所有可能的擴展類型A,然後檢查它們中的任何/全部是否可以隱式地從int,解決潛在的歧義...注意全部類型從一個給定的類型延伸是一個開放的集合,可以擴展當前的翻譯單元已經建成!

您可以通過不同的方式實現類似的功能,例如創建一個函數,該函數使用int並返回A對象,或者明確創建B。但是它們都不允許隱式轉換(即不修改代碼以顯式請求轉換路徑)。

1

編譯沒有問題,

int main() 
{ 
    class A { 
    public: 
     A(int i) 
     {} 
     static double test_code(const A& a) { return 0.0; } 
    }; 

    class B : public A { 
    public: 
     B(int i) 
      : A(i) {} 
     static double test_code2(const B& b) { return 0.0; } 
    }; 

    A::test_code(2); 
    B::test_code2(2); 

    return 0; 
} 
+0

是的,但整個觀點是,我不希望A有你添加的構造函數 – lezebulon

+0

那麼,這是不可能的。 C++是一種具有預定義規則的語言。它不能只是讀你的思想。 – Hindol

+1

@lezebulon - 如果這是「整點」,應該在問題中提及。 –