2011-12-22 56 views
3

我有一個類,我需要隱式轉換爲一些中間值,例如鏈接隱式轉換運算符

struct outer { 
    struct inner { 
     operator T() { return T(); } 
    }; 
    operator inner() { return inner(); } 
}; 

如果我有這樣的結構,是總是有效的事,例如

void f(T t); 
outer o; 
f(o); 
+2

什麼是T?模板類型? –

+2

@MooingDuck:一種類型。 T是什麼並不重要。這不是模板,因爲我沒有參數? – Puppy

+4

'f(o)'需要兩次用戶定義的轉換,而標準允許最大std-conversion - > u-d conversion - > std-conversion。 –

回答

8

§13.3.3.1.2 [over.ics.user] p1

用戶定義的轉換序列由後跟一個第二標準的轉換序列的初始標準轉換序列,隨後一個用戶定義的轉換(12.3)的。

注意單詞「序列」的單數和缺失。在隱式轉換序列中,永遠只會考慮一個用戶定義的轉換。

+0

是否有相應的位表示僅會出現一個「用戶定義的轉換序列」? – ssube

+0

@peachykeen這是參數傳遞的定義。對於類類型,它涉及一個用戶定義的轉換序列(如果參數類型不同於參數類型),然後將臨時結果「T」的最終副本轉換爲類型爲「T」的參數。 –

0

這工作:

struct Foo {}; // renamed T in Foo to avoid confusion! 

struct outer { 
     struct inner { 
       operator Foo() { return Foo(); } 
     }; 

     operator inner() { return inner(); } 

     template <typename T> 
     operator T() { 
       return operator inner(); 
     } 
}; 

int main() { 
     void f(Foo t); 
     outer o; 
     f(o); 
} 

但僅僅因爲f不超載,所以它不是一個真正的解決方案。

+0

如果這是可以接受的,我只需在外部類中創建'Foo'運算符。 – Puppy

+0

我並不感到驚訝,這不是「可以接受的」,但它是我得到的最好的「修復」。 – curiousguy