2013-06-13 65 views
0

第14行的代碼無法編譯,因爲轉換沒有完成,但由於顯式轉換運算符,16,17中的代碼正常工作。轉換無法完成的原因

1 
    2 #include <iostream> 
    3 using namespace std; 
    4 template<typename T,int N>class Array{ 
    5   private: 
    6   T _M_data[N]; 
    7   public: 
----  operator T*(){return _M_data;} 
----  operator T(){return _M_data[0];} 
++++  T* data(){return _M_data;} 
10 }; 
11 int main(int argc,char*argv[]) 
12 { 
13   Array<int,5> i5A ; 
14   //printf("%d\n",i5A); 
15   //won't work,need explicit conversion 
16   printf("%d\n",i5A.operator int()); 
17   printf("%p\n",i5A.operator int*()); 
18 return 0; 
19 } 

更新:
我知道爲什麼標準需要一個data()功能:printf("%d\n",*(i5A.data()));

+0

看看va_init,va參數需要知道類型,因此打印完成時會超出給定的類型(%d => int),因此printf會設想您執行JOB。在C++中,cout使用方法覆蓋來爲所有類型確定相同的運算符<<。當你給不同類型的過載建立正確的操作員過載 – Lefsler

回答

6

printf是一種原始和簡單的功能。它不知道你傳入的是什麼類型,更不用說如何轉換它們。如果您指定"%d",它將只讀取您傳遞的參數int,吐出並繼續下一個參數。或者崩潰。只是不要這樣做。如果你作出承諾,保留它 - %d是你承諾通過int

+0

偉大的答案!是的,printf()有它的怪癖。 –

0

在第13行,沒有隱式轉換。字符串格式不會更改傳遞的對象的類型。

0

您傳遞給printf的格式字符串指定一個十進制整數,但您傳遞的是數組。你需要傳遞一些可以轉換爲int的數字類型(或者更好的是,一個實際的int)。如果要打印多個值,則可能需要遍歷數組並打印每個元素。

2

轉換不能因爲在像printf格式字符串是由printf的內部在運行時解析和通過的printf的內部在運行時進行可變參數參數檢索參數可變型函數隱式進行。對於編譯器"%d\n"只是一個字符串。編譯器不解析格式字符串,也不知道如何解釋該格式字符串,因此它不知道該參數需要轉換,並且不知道將其轉換爲什麼類型。

P.S.某些編譯器可以從標準函數的格式字符串中檢索該信息,如printf。他們純粹是爲了錯誤檢查的目的。將這些知識用於隱式參數轉換在技術上是可行的,但它會產生一個相當深遠的非標準特徵。這個特性在C++中沒有地位。當然,編譯時格式化字符串的解析只有在編譯時實際知道該字符串時纔有可能,但並非總是如此。

0

printf是可變參數函數。 varargs函數的參數類型沒有指定,因此無法知道參數應該轉換爲什麼類型。某些基元類型有一些默認轉換(例如,布爾轉換爲int)。但用戶定義的轉換不會隱式完成。

相關問題