所以我有这个课
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>
的每个实例,那么它可以正常工作。
我的问题到底是什么?我在这里没有正确理解的是什么?
答案 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在他的回答中所说。
请注意,如果传递给模板的参数与特化指定的模式匹配,编译器(不是您)将选择(部分)特化。这有一个不同的用例。你的情况似乎有所不同。