總會有一個人需要你的分享~!- 唐風(fēng) -
這兩天寫代碼,遇到這么一個模板決議的問題: 有一個類 A,其中有兩個數(shù)據(jù)成員(方便起見都是 public )。為了從其它部分(比如文件)讀入數(shù)據(jù),我為 A 類重載了輸入流操作符。代碼如下所示:程序1
一般使用標(biāo)準(zhǔn)IO流的話,這樣做至少在編譯上是沒有問題的(讀二進(jìn)制文件不行,后有補充)。 在我的程序中,我目前只是測試時用文件讀取,到后期,肯定會換成其它形式(可能是直接大塊類似的數(shù)據(jù)整在一起,放在內(nèi)存中之類),所以我打算為數(shù)據(jù)源寫一個包裝類,在目前的階段,直接轉(zhuǎn)到標(biāo)準(zhǔn)IO文件讀取,后期再修改數(shù)據(jù)源類。因為使用數(shù)據(jù)源類需要保持與標(biāo)準(zhǔn)IO的寫法一致( cin>>xx ),所以這個類要為每種基本類型重載輸入流操作符。這些重載的代碼結(jié)構(gòu)都是一樣的,只是數(shù)據(jù)類型不同,因此用模板是最好的,所以一開始,我寫成了下面這個樣子:程序2
但在實際使用時,像下面的語句,就發(fā)生了編譯問題:
編譯器對這段代碼抱怨,說無法確定使用哪個模板…… 當(dāng)然,我是希望編譯器在這里使用程序一中的非成員模板函數(shù),然后在那個模板函數(shù)中,再用程序2中的成員模板函數(shù)來實例化基本類型的輸入操作。可是編譯器沒有這么智能,我理解,這里用A做模板參數(shù)的話,確實有二義性。 想來想去沒想到好的辦法消除這種二義性,只好修改代碼,去掉其中一個的模板定義。類比地思考一下,標(biāo)準(zhǔn)IO并沒有發(fā)生這個問題,因為標(biāo)準(zhǔn)IO的輸入流操作并不是模板函數(shù),而這里的DataFromFile類,明顯使用模板會比較優(yōu)雅,但二義性的問題不知道怎么解決。最后沒辦法,改成用宏來實現(xiàn),代碼如下:程序3
問題是沒有了,但總覺得不是滋味。(不知道有沒有更好的解決辦法?哪位大俠指點下?)PS: 對 C++ 的標(biāo)準(zhǔn) IO 流還不熟,在以二進(jìn)制方式打開文件時,使用 >> 操作符無法讀入數(shù)據(jù)?一開始的時候調(diào)了很久,后來才發(fā)現(xiàn)這里可能有問題,轉(zhuǎn)成使用 .read() 方法來讀數(shù)據(jù),就成功了。標(biāo)準(zhǔn) IO 還是得好好再補補啊。
Powered by: C++博客 Copyright © 唐風(fēng)