2012-07-06 109 views
0

我正在嘗試編寫一個幫助程序員編寫正確代碼的模板類。它將計算從舊金山到紐約經華盛頓的路線,從舊金山到華盛頓的路線以及從華盛頓到紐約的路線。當從舊金山到洛杉磯和華盛頓到紐約的路線時,編譯器會報告一個錯誤。具有模板功能,專業化的類模板

這裏是類(不正常的主力功能):

extern const char miami[] = "Miami"; 

template< const char* FINISH, const char* START> 
class Route { 
public: 
    Route(); 
    ~Route() {}; 

    template<const char* OTHERPLACE> 
    Route<START, OTHERPLACE> alterFinish() const; 
}; 

template<const char* START> // specialisation 
template<const char* OTHERPLACE> 
// Allow only miami as FINISH to be changed to something else. 
Route<START, OTHERPLACE> Route<START, miami>::alterFinish() const{ 
    return Route<START, OTHERPLACE>(); 
} 

可惜,這是行不通的。我得到'不完整類型的錯誤使用'錯誤。沒有專業化的同樣的功能編譯。我究竟做錯了什麼?

+0

是否有理由需要使用字符串文字而不是枚舉? – ildjarn 2012-07-06 22:13:24

回答

2

invalid use of incomplete type表示您使用了尚未聲明的內容。在這種情況下,它的Route部分特:

template <const char* START> 
class Route<START,miami>{ 

    template<const char* OTHERPLACE> 
    Route<START, OTHERPLACE> alterFinish() const; 
}; 

爲什麼需要這個?那麼,你想創建一個方法alterFinish(),這應該是專門爲template<class START> Route<START, miami>。全名是Route<START, miami>::alterFinish()。但是你從未在任何地方定義過template<class START> Route<START, miami>。這是一個不完整的類型,因此編譯器無法編譯。

但是,我相信你的程序中還有其他一些錯誤。你真的需要使用模板嗎?不會像std::map<std::pair<city,city>, double>足夠你的成本?你真的想把你的城市保存爲字符串文字嗎?

此外,它還不清楚爲什麼你的程序在你的特殊場景中崩潰。根本沒有足夠的代碼,即使您提供的代碼不會提供編譯器錯誤,除非增加了必要的調整並移動了許多符號。

+0

謝謝Zeta!多次閱讀您的答案後,它開始有意義。我現在已經定義了部分模板類專業化Route ,並給它(並且只有它)一個成員函數alterFinish()。現在它可以工作,但我確實有一些閱讀到這裏... – user1290034 2012-07-07 06:40:21

+0

我沒有在5分鐘內完成....所以這裏是完整的評論: 謝謝Zeta!多次閱讀您的答案後,它開始有意義。我現在已經定義了部分模板類專業化Route ,並給它(並且只有它)一個成員函數alterFinish()。現在,它的工作原理,但我確實有一些閱讀到這裏... 我認爲有必要使用模板,因爲我想要編譯時間檢查我的路線。就像物理公式的尺寸正確性[鏈接](http://www.boost.org/doc/libs/1_50_0/libs/mpl/doc/tutorial/dimensional-analysis.html)。 – user1290034 2012-07-07 06:47:51