2014-01-14 53 views
0

我有幾個功能,我用的是已經定義類可以用作通用名稱空間(使用模板)嗎?

class Object { 
    struct SubObject{ 
     //... 
    }; 
    //... 
}; 


namespace Process 
{ 
    Object::SubObject function1(Object& o){ 
     //..   
    } 

    void function2(Object& o){ 
     //.. 
    } 
} 

現在,我要概括這些功能與模板類使用一個命名空間,我發現我不能用一個模板在整個命名空間。要麼我必須爲每個函數創建一個模板(相當乏味,因爲我必須每次鍵入每個類的結構),或者我想知道是否可以執行類似定義類而不是命名空間的操作:

template<typename TObject> 
class Process 
{ 
    typedef typename TObject::SubObject TSubObject; 

    TSubObject function1(TObject& o){ 
     //..   
    } 

    void function2(TObject& o){ 
     //.. 
    } 
} 

這是正確的代碼嗎?做一個我永遠不會實現的課程似乎很奇怪。

而且,我第一次寫:

typedef TObject::SubObject TSubObject; 

但我的編譯器要求我在TObject的前面加上類型名,我發現這個question解釋(或者這就是我理解它),這是因爲編譯器沒有按不知道SubObject是嵌套類型還是成員變量。但是不是typedef強制後跟一個類型,然後是一個別名? 我認爲一個類成員(一個變量或函數)不能被「typedef」編輯。

非常感謝您的回答。

+0

如果沒有實例,你不能調用你的示例中的函數,那麼你需要使它們成爲「靜態」函數!另一種選擇是簡單地在名稱空間級別提供模板化函數。 –

+0

@πάνταῥεῖ:是的,但我必須爲命名空間中的每個函數創建一個模板,併爲每個函數中的每個嵌套類型創建一個typedef(我在Object中有十幾個嵌套類型,我想避免使用typedef/typename每次)。 – Demod

+0

然後在模板類中使用靜態函數的其他選項。 –

回答

0

C++語法/規範指出,任何時候都有一個可能是類型或變量的限定名稱(即使在上下文中也是如此),除非用前綴typename作爲變量,否則它將始終被視爲變量。

相關問題