2012-10-21 66 views
5

我有一種情況,就是這樣的人爲的例子:如何聲明的自參考模板類型

template<class TFeature> struct Controller {}; 

template<class TController,typename T> struct Feature { 
    typedef Feature<TController,T> FeatureType; 
}; 

typedef Controller<Feature::FeatureType,int> DefaultController; 

的控制器是模板化的接受特點和我的問題是,一些功能需要的類型控制器作爲模板參數。這使得樣本最後一行的typedef不能編譯。

這是可能的還是我需要重新考慮設計?

+1

@RondogiannisAristophanes,我認爲這是問題的地步。 – bdonlan

+0

爲什麼你不能在struct之外聲明'FeatureType'? – alestanis

+1

-1提供的代碼是* invalid *,對於一個正式的參數使用兩個實際的模板參數。它也是*無意義的*,其中'Feature'類型定義爲'FeatureType'。 –

回答

2

爲了做到這一點,你應該做一些元編程魔術(並相信我這不是一件容易的事)。但如果你真的NEAD並使用boost你看看boost::mpl,你可以有這樣的事情是一個選項:

template< class ControlerT > 
struct FeatureEx { 
    typedef ControlerT controler_type; 
}; 
template< class FeatureT > 
struct ControlerEx { 
    typedef ControlerEx<FeatureT> this_type; 
    typedef typename boost::mpl::apply< 
     FeatureT, boost::mpl::identity<this_type> 
    >::type feature_type; 

    feature_type const& get_feature() const {return f_;} 

private: 
    feature_type f_; 
}; 

typedef ControlerEx<FeatureEx<boost::mpl::placeholders::_1> > DefaultControler; 
+0

我相信這是可以爲我工作的方法,並且我已將其標記爲我接受的答案。非常感謝所有花時間回答的人。 –

0

一種選擇是使用的,而不是一個typedef一個虛擬子類:

struct DefaultController : public Controller<Feature<DefaultController,int>::FeatureType> {}; 
1

您傳遞給Controller類兩個模板參數,但你已經宣佈它只拿一個。你需要類似以下的東西嗎?

typedef Controller<Feature<Controller<int>,int>::FeatureType> DefaultController; 
0

似乎你想傳遞2個參數給你控制器模板,雖然它只能接受一個。