2009-11-23 118 views
2

我有以下設置:模板的問題:能否編譯器推斷模板類型靜態方法

一個模板類SpecialModel:

template<typename A, typename B> 
class SpecialModel<A, B> { 
}; 

用模板的工人,從事某種型號:

template<typename M> 
class Worker<M> { 

    Worker(M& model); 

    void work(); 
}; 

和工人對SpecialModel專業化:

template<typename A, typename B> 
class Worker<SpecialModel<A, B> > { 

    Worker(SpecialModel& model); 

    void work(); 
}; 

最後,還有就是HANDELS 一個給定的工作人員通過一個靜態方法的類, 基本上這Manager類也很多 管理的事情,允許在實際工作中工人 重點:

template<typename W> 
class Manager<W> { 

    Manager() {}; 

    static void getThingsDone(W worker) { 
     ...; 
     worker.work(); 
     ...; 
    }; 
}; 

要' getThingsDone」的SpecialModel,我需要在以下代碼 :

SpecialModel<A1, B1> spmo; 
Worker< SpecialModel<A1, B1> > w(spmo); 
Manager<Worker< SpecialModel<A1, B1> > >::getThingsDone(w); 

的最後一行是一個我有問題。是不是 有沒有辦法,只是說:

Manager::getThingsDone(w); 

無法編譯器從ω推斷W的類型?

爲什麼我要那個,反正呢?我有一系列的工作人員, 在不同種類的SpecialModels(不同的As和 Bs)上工作。現在我想循環這個數組,每個worker都調用Manager :: getThingsDone(w) 。當只有工人數組時,我應該如何將類型信息 傳遞給Manager? (SpecialModles的數組在編譯時已知(此代碼的部分 是自動生成的,然後編譯爲此類特殊輸入的 類型),該數組將在代碼的頂級位置處定義在某處 ,但代碼正在執行工作 應儘可能通用。但是,我會很樂意 找到一個答案,而不考慮這最後一點)。

+0

恩,那個'Train'的東西進入了,你爲什麼要介紹'經理'去? – sbi 2009-11-23 10:08:02

+0

雖然你真的只想問爲什麼編譯器無法推導出模板參數,但你的問題很長。請參閱下面的答案。 – Sebastian 2009-11-23 10:11:03

+0

呃,*腮紅*,固定它(該死的複製和粘貼)。 – osdf 2009-11-23 10:12:34

回答

4

如果列車是一個模板類,因爲它似乎是,編譯器不能推斷類從靜態方法模板參數模板。

如果Train :: train是一種靜態方法,爲什麼您的課程培訓模板?方法列車無論如何都不能訪問任何成員變量。你也許可以讓訓練免費功能:

template<class W> 
void train(W const& w) { ... } 

而在你的代碼,你可以簡單地做

train(w); 

如果班列車必須用型工人作爲模板,你可以寫一個輔助函數,可以發現自動模板參數:

template<class W> 
Train<W> make_trainer(W const& w) { return Train<W>(w); } 

您也可以培養培養一流的靜態函數有自己的模板參數:

012然後
class Train { 
    template<class W> 
    vod train(W const& w) { ... } 
}; 

你的代碼可以調用

Train::train(w); 

什麼是最好的取決於你的具體使用情況。

+0

問題解決了!謝謝塞巴斯蒂安。 – osdf 2009-11-23 10:20:00