2016-02-05 175 views
-1

爲了避免傳遞給8位系統上的許多常量,但仍然保持代碼模塊化,我使用了非類型模板)接收這些常量的參數。只要我只傳遞參數對象「一層」,就可以毫無問題地工作。模板:如何將非類型參數對象作爲非類型參數傳遞給另一個模板

如果我嘗試使用這種模板對象作爲非類型參數到另一個模板時,編譯器拒絕我的企圖,甚至宣佈這樣的模板:

struct Params {constexpr Params(int i){}}; 
extern constexpr Params const p(1); 

// This compiles fine 
template <Params const &p> class A { }; 
A<p> a; 

// This does not compile 
template <A<Params const &> &a> class B { }; 
B<a> b; 

所以我的問題是:是否有人知道如何定義一個接收另一個(非類型)模板的對象作爲參數的模板?

回答

0

您正在定義A是與非類型參數p但隨後的B定義要傳遞一個到模板A(即類型Params const&)(類型Params const&)的模板。即使它不具有類型參數,您仍然認爲它是A

但是這工作得很好:

template <A<p> &a> class B { }; 
B<a> b; 

如果你想B接受A<P>類型的參數爲任何P,那麼你需要P一個額外的模板參數。

template <Params const& P, A<P> &a> class B { }; 
B<p, a> b; 
+0

感謝您的回答,這明顯地解決了問題中描述的問題。唯一的缺點是通過指定'p'兩次產生的冗餘 - 儘管編譯器可以檢查它。 – kandid

+0

@kandid是的,我也不太高興。但我想不出這種情況下的解決方法。當你有一個類型參數時,它是不同的,因爲那樣你就可以使用專門化了。 – Brian