我遇到了部分模板专业化的问题。
我有这个小帮手模板和部分专业化:
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。我认为我做错了,因为如果部分特化是匹配的,它将在基础模板之前被选中。怎么了?
答案 0 :(得分: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
。简单的替换。
现在我们已经确定T
已被int
替换,您希望ctor_std_vector_get<T>
或ctor_std_vector_get<int>
使用哪个模板,默认模板,还是专业化?