2016-04-28 87 views
2

我遇到部分模板專業化的問題。C++無法選擇正確的部分模板專業化

我這個小幫手模板和部分特化:

template<typename T> 
struct ctor_std_vector_get 
{ 
    static_assert(false,"ERROR"); 
}; 


template<typename T> 
struct ctor_std_vector_get<const std::vector<T>> 
{ 
    static const T& get(const T& x){ 
     return x; 
    } 
}; 

然後,我用它是這樣的:

template<typename T> 
class container 
{ 
    public: 

    container(const std::vector<T>& inp): 
    { 
     alloc(); 

     for(const T& t : inp){ 
      const T& x = ctor_std_vector_get<T>::get(t); 
     } 
    } 
} 

但是,當我編譯,我打的static_assert,當我要部分專業化。我認爲我做錯了一些事情,因爲如果局部特化是匹配的,它將在基礎模板之前被選中。怎麼了?

回答

3
container(const std::vector<T>& inp): 
{ 
    alloc(); 

    for(const T& t : inp){ 
     const T& x = ctor_std_vector_get<T>::get(t); 
    } 
} 

假設您通過了std::vector<int>作爲該函數的參數。

因此,T部分,在const std::vector<T>&將是int。簡單的替代。

現在,我們已經建立了Tint取代,你想到的是ctor_std_vector_get<T>,或ctor_std_vector_get<int>拉閘使用,默認的模板,或者專門的模板?

+0

感謝您的回覆。 我從讀例如cppreference中得到的想法是,一旦找到基模板(帶有static_assert的模板),編譯器就會查找(部分?)特化,其中我想要的是部分特化,我認爲 –

+0

你的想法絕對100%正確。如果你試圖回答我的問題,你的答案是:默認模板,因爲模板參數是'int',而不是'std :: vector ',因爲'T'是'int'。 –

+0

再次感謝。想想我明白了,ctor_std_vector_get >。但現在我有一個後續問題。即使這個工程,我仍然得到static_assert,但不是沒有編譯基礎模板? –