2013-10-05 51 views
2

專業成員函數,我寫了一個模板容器類MyCont:爲模板容器類

#include <iostream> 
template <class T> 
class MyCont 
{ 
    public: 
     void SomeFunc(); 
     T* list; 
}; 

template <class T> 
void MyCont<T>::SomeFunc() 
{ 
    std::cout<<"in function"<<std::endl; 
    //... 
} 


int main() 
{ 
    MyCont<int> y; 
    y.SomeFunc(); 
    MyCont< MyCont<int> > x; 
    x.SomeFunc(); 
} 

這工作得很好。然而,在MyCont具有MyCont的情況下,我希望能夠改變SomeFunc()的行爲。 我不知道如何做到這一點(或者即使有可能)。我試着加入這個SomeFunc()的第一個定義如下:

template <> 
void MyCont< MyCont<class T> >::SomeFunc() 
{ 
    std::cout<<"in altered function"<<std::endl; 
    //... 
} 

這編譯,但它始終是被稱爲

感謝

+0

我認爲你需要完全專業化的類。哦,'free'類型在專業化開始時會進入'template <>''。 – Yakk

回答

0

,在有趣的實際上是首創的SomeFunc案件。我想你的意思是寫

template <class T> 
void MyCont< MyCont<T> >::SomeFunc() 
{ 
    std::cout<<"in altered function"<<std::endl; 
    //... 
} 

這將無法編譯。取而代之的是,你寫

template <> 
void MyCont< MyCont<class T> >::SomeFunc() 
{ 
    std::cout<<"in altered function"<<std::endl; 
    //... 
} 

外類的,所以class T,這是錯誤的,前瞻性聲明瞭一個類型T。這意味着編譯器會生成一個MyCont專用的函數,它不存在,因此不被使用。

要明白我的意思,添加以下專業化的主模板之後:

template <class T> 
struct MyCont< MyCont<T> > : MyCont<T> 
{ 
    void SomeFunc(); 
}; 

其中,連同第一,固定的版本現在將調用。如果沒有專業化的課程,你無法實現你所期望的。

Live example

+0

我實際上嘗試了第一個盒子裏的東西。當它失敗時,我會嘗試四處搜尋,直到找到編譯但無效的東西。你建議的工作,非常感謝你的幫助。 – bumpt

+0

我對您的解決方案有疑問。似乎在改變SomeFunc(),我需要通過解引用這個指針來訪問MyCont的所有成員。在你鏈接的實例中,在第28行輸入list = 0編譯得很好,但是在第21行輸入它將會失敗,除非你使用this-> list = 0。是否有一個原因? – bumpt

+0

@ user2849689是的,有一個原因。因爲你在繼承* list的專業化,所以你需要使用'this->',因爲它需要是在階段2中查找的從屬表達式。沒有它,在全局階段1命名空間,這不是你想要的。 [This](http://stackoverflow.com/questions/13674643/explicit-this-in-member-functions/13674722#13674722)可能會幫助您理解C++中的2階段查找。 –

-1

必須部分專注提供完整類型的模板而已,允許編譯器爲每一類不同的代碼,該修改示例工作如您所願,但它看起來不那麼靈活了(嚴格MyContŧ = int綁定):

#include <iostream> 
template <class T> 
class MyCont 
{ 
    public: 
     void SomeFunc(); 
     T* list; 
}; 

template <class T> 
void MyCont<T>::SomeFunc() 
{ 
    std::cout<<"in function"<<std::endl; 
    //... 
} 

template <> 
void MyCont<int>::SomeFunc() 
{ 
    std::cout<<"in altered function"<<std::endl; 
    //... 
} 

int main() 
{ 
    MyCont<int> y; 
    y.SomeFunc(); 
    MyCont< MyCont<int> > x; 
    x.SomeFunc(); 
}