2010-10-09 119 views
2

忽略這個問題,才發現在我的代碼錯誤,標誌它類型檢測

這是「完全指南模板」中刪除。 19.2
化合物類型是從其他類型構建的類型。簡單的複合類型包括普通類型,指針類型,引用類型,甚至數組類型。它們是從單一基本類型構建的。類類型和函數類型也是複合類型,但是它們的組合可以涉及多種類型(對於參數或成員)。簡單化合物類型可以使用部分專業化進行分類。我們先從描述比類類型和枚舉類型(後者被分別處理的)其它化合物類型一個性狀類的通用定義:

// types/type2.hpp 
template<typename T> 
class CompoundT {   // primary template 
    public: 
    enum { IsPtrT = 0, IsRefT = 0, IsArrayT = 0, 
      IsFuncT = 0, IsPtrMemT = 0 }; 
    typedef T BaseT; //This suppose to be different 
    typedef T BottomT; //to this! But is typedef'ed in the same way! FFS! 
    typedef CompoundT<void> ClassT; 
}; 

的構件類型BASET是對直接型的同義詞在其上的模板參數類型T構建。另一方面,BottomT指的是構建T的最終非指針,非參照和非數組類型。例如,如果T是int * ,那麼BaseT將是int,而BottomT將是int。
是否做到了這一點,並嘗試過並猜測哪些方法無效。對於int ** BaseT是int **和BottomT是相同的。對我來說,很明顯,這本書有一個錯誤。如何在地球上相同的typedef'ed類型可以是不同的?對我來說它不能。我想知道應該在那裏(在階級decl。),使其工作。
謝謝。

+1

爲什麼要刪除它的標誌?你可以自己刪除它 – 2010-10-09 16:50:08

+0

@ArmenTsirunyan,顯然,他不能。你回答了他的問題。我相信你知道,只有在沒有得到回答的情況下,主人才能刪除問題:) – azizbekian 2013-03-02 10:52:25

回答

0

那麼專精在哪裏?是的,如果我理解正確,這是應該爲非複合類型實例化的主模板。當然,僅憑這個模板,什麼都不能做。在另一方面,讓我們看一下指針專業化(用於陣列等,這是類似)

template<typename T> 
class CompoundT<T*> {   // specialization for pointers 
    public: 
    enum { IsPtrT = 1, IsRefT = 0, IsArrayT = 0, 
      IsFuncT = 0, IsPtrMemT = 0 }; 
    typedef T BaseT; 
    typedef typename CompoundT<BaseT>::BottomT BottomT; 
    typedef CompoundT<void> ClassT; //not sure what this is for 
}; 

現在,對於int **巴塞特將是int *和BottomT將是int。 HTH