2012-09-24 22 views
1

我有模板類如何存儲模板對象在地圖

template<class T1 ,class T2, class T3> 
class server_fd 
{ 
    T1 servport; 
    T2 server_ip; 
    T3 servobj; 
    int local_port; 

public: 
    server_fd(const T1& servport, const T2& server_ip,const T3 servobj) { 
    this->servport=servport; 
    this->server_ip=server_ip; 
    this->servobj=servobj; 

    cout <<"check \n"<<this->server_ip; 
    } 
};  

現在我想保存這個類在地圖中的對象,所以我聲明地圖這樣的..

map<int,server_fd* > MapPairList; 

在此之後,當我complile我的代碼它給這個錯誤 錯誤:模板參數2無效 錯誤:模板參數4無效

但是,如果我沒有你se模板類我能夠成功定義地圖。

是否有任何其他方式來定義存儲模板類對象的映射?請告訴我。

+0

如何使用自定義類型的map *>'?請記住,該模板根本沒有泛型,地圖中的每個項目必須具有三種類型的相同組合!因此,除非定義一些接口並在其中封裝函數和訪問器,否則不能在一個映射中將'server_fd '與'server_fd '混合。 –

+1

'server_fd'不是一個類型,它是一個模板。你需要給它T1,T2,T3的特定類型才能使用它。 – Flexo

+0

我試過這個映射 *> ==> map *>不知道第三個參數是否正確放置了..在T3我必須通過服務器對象。我仍然收到錯誤Transportlayer.cpp:44:錯誤:在模板參數列表中爲模板參數列表中的類型/值不匹配,該模板參數列表中的模板 class server_fd' Transportlayer.cpp:44:error:expected一個類型,得到'server_fd' Transportlayer.cpp:44:錯誤:模板參數2無效 Transportlayer.cpp:44:錯誤:模板參數4無效 – user1693566

回答

0

嘗試增加一個基類的模板類:

class server_fd_entry {}; 

template<class T1 ,class T2, class T3> 
class server_fd 
{ 
    <snip> 
} 

... 

map<int,server_fd_entry* > MapPairList; 

這樣,地圖可以存儲所有server_fd類型不管的模板參數。我可以看到這導致大量向下轉換,然而,這樣的選擇是,以確保您指定的所有模板參數在聲明地圖:

map<int,server_fd<int,int,int>* > 

這樣,你只能存儲一個特定類型的server_fd的,但如果這就是你所需要的,它可能會更整潔。

0

如果你能以某種方式對這些類型的訪問進行抽象,你可以讓你的模板類繼承自一個抽象基類,而不僅僅是指向你的地圖中的基礎指針。

這就是所謂的類型擦除,你可以得到更多關於在這裏Type erasure techniques

+0

我嘗試過使用此映射 *> map *> – user1693566

+0

@ user1693566:模板'server_fd'的第三個參數'T3'也必須是一個類型。你也在傳遞'server_fd'。這可能是錯誤的 - 爲什麼要傳遞'server_fd'到'server_fd'? - 肯定是錯誤的,因爲'server_fd'是一個模板,因此與類型參數'T3'不匹配。 – MSalters

+0

在T3我想存儲通用對象..let說我有TCPserver和UDPServer類,我想存儲這些類的對象在地圖中,所以如果我像這樣的地圖 *> – user1693566

相關問題