部分模板专业化没有给出正确的结果

时间:2014-05-01 06:34:52

标签: c++ templates c++11 specialization

所以我有这个课

template<typename T, std::size_t Columns, std::size_t Rows>
class mat_base;

我有这个专业化

template<typename T, std::size_t ColumnsRows>
class mat_base<T, ColumnsRows, ColumnsRows>;

每当我尝试将此部分特化用于返回类型或变量时,我会收到错误,但我没有提供足够的模板参数:(

以下是我使用的一个例子,说明没有足够的论据:

template<typename T, std::size_t ColumnsRows>
mat_base<T, ColumnsRows> transpose(const mat_base<T, ColumnsRows> &lhs, const mat_base<T, ColumnsRows> &rhs);

如果我用mat_base<T, ColumnsRows>替换mat_base<T, ColumnsRows, ColumnsRows>的每个实例,那么它可以正常工作。

我的问题到底是什么?我在这里没有正确理解的是什么?

2 个答案:

答案 0 :(得分:3)

您不能引用模板部分特化。您必须引用该模板,如果它与部分特化匹配,则将使用部分特化。

template <typename T>
struct S;

template<>
struct S<int> { };

您不希望能够引用S<>(未指定int),是吗?

template <typename T>
struct S;

template <typename T>
struct S<T *> { };

您希望S<int *>将部分专精与T = int匹配,而不是T = int *,对吗?

这里没有区别。如果模板有三个参数,则需要三个参数才能使用模板。

答案 1 :(得分:1)

如果您希望第二个和第三个模板参数完全相同,那么您可以使用模板别名而不是部分特化(因为后者不适用于此)

template<typename T, std::size_t ColumnsRows>
using mat_base_t = mat_base<T, ColumnsRows, ColumnsRows>;

如果您只想传递两个参数(而不是三个),请使用mat_base_t而不是mat_base,如下所示:

template<typename T, std::size_t ColumnsRows>
mat_base_t<T, ColumnsRows> transpose(const mat_base_t<T, ColumnsRows> & lhs, 
                                     const mat_base_t<T, ColumnsRows> & rhs);

或者使用默认值作为mat_base类模板的第三个参数,正如@DieterLücking在他的回答中所说。

请注意,如果传递给模板的参数与特化指定的模式匹配,编译器(不是您)将选择(部分)特化。这有一个不同的用例。你的情况似乎有所不同。