2017-02-10 137 views
-1

我使用的模板庫中,B類是A類參數化我有一個聲明C++模板參數推導/ substition失敗

template <class A, template <class A> class B> 
void foo(){ 
    B<A> x; 
} 

後來我想調用這個作爲一個

模板類
foo<A, B>(); 

其中X是庫中的具體類,Y是庫中特定的模板具體類。但是,我得到的標題錯誤abour模板參數扣除/替換失敗。如果我將foo的聲明更改爲刪除模板並在X和Y中替換,則一切正常。我也嘗試過

foo<X, Y<X> >(); 

失敗的消息是相同的。有人可以解釋爲什麼會這樣嗎?

我用gcc 5.3.0

這裏有一個完整的例子給指定的行爲

#include <vector> 
template <class A, template <class A> class B> 
void foo() { 
    B<A> x; 
} 
void bar() { 
    foo<int, std::vector>(); 
} 
+1

提供一個[MCVE]如需要請。 –

回答

2

你有兩個問題,我可以看到。

首先是std::vector需要多個模板參數,所以模板模板參數template<class A> class B永遠不會匹配std::vector

第二和問題的稍顯不足的是,class A這裏template<class A> class B陰影以前class A這裏template <class A/*here*/, template <class A> class B>

要解決這兩個問題,你可以聲明第二個模板參數作爲一個無名的可變參數模板,像這樣:template <class...> class B

結合一切你:

#include <vector> 
template <class A, template <class...> class B> 
void foo() { 
    B<A> x; 
} 
void bar() { 
    foo<int, std::vector>(); 
} 

編輯:

如果你想只使用B以B<A>形式,你可以做的幾件事情之一:

template <class A, template <class...> class B> 
void foo() { 
    using C = B<A>; 
    C x; 
} 

OR:

template <class A, template <class...> class B, class C = B<A>> 
void foo() { 
    C x; 
} 

OR(取決於你的代碼的大點),你可以只接受整個事情作爲一個模板參數:

template <class A> 
void foo() { 
    A x; 
} 
void bar() { 
    foo<std::vector<int>>(); 
}