C ++无法选择正确的部分模板专业化

时间:2016-04-28 23:54:03

标签: c++ templates template-specialization

我遇到了部分模板专业化的问题。

我有这个小帮手模板和部分专业化:

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。我认为我做错了,因为如果部分特化是匹配的,它将在基础模板之前被选中。怎么了?

1 个答案:

答案 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>使用哪个模板,默认模板,还是专业化?