2013-02-06 128 views
6

此代碼unexplicably不編譯:C++函數模板參數與模板化型結構愁楚

struct sometype 
{ 
    template <typename T> 
    T* get() { return nullptr; } 
}; 

template <typename T> 
struct anothertype 
{ 
#if 1 
    template <typename T2> struct some_wrapper { typedef T2 type; }; 
    typedef typename some_wrapper<sometype>::type thetype; 
#else 
    typedef sometype thetype; 
#endif 
    typedef thetype* Ptr; 

    Ptr m_ptr; 
    T* get() { return m_ptr->get<T>(); } 
}; 

如果我改變#if參數爲0時,它以某種方式固定。有人可以解釋一下嗎?請注意,顯然毫無意義的some_wrapper事實上在我的真實代碼中有用。

我用G ++ 4.7.1與-fstd=gnu++11,錯誤如下(指向哪裏,我宣佈anothertype<T>::get行:

error: expected primary-expression before '>' token 
error: expected primary-expression before ')' token 
+0

如果你完全運行你通過編譯器發佈的代碼,你會得到那個錯誤嗎? –

+0

@DavidRodríguez-dribeas http://ideone.com/N8dQoj(完全是問題的代碼) – leemes

回答

6

您應該解決您的函數調用如下,加入template關鍵字:

T* get() { return m_ptr->template get<T>(); } 

您可以檢查this link以獲取對語法的解釋。

8

這很難告訴你所有的類型定義,但我打賭你需要:

m_ptr->template get<T>(); 
+0

+1。 –

+0

但是...爲什麼? 'm_ptr'總是*'sometype *'。 – ipc

+1

@ipc他有'#if 1'這將是真實的,所以'm_ptr'是'typename some_wrapper :: type *',依賴類型 –