2016-04-28 88 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,但不是没有编译基础模板? –