c++ - 部分模板特化没有给出正确的结果

标签 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>它工作正常。

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

最佳答案

您永远不能引用模板部分特化。你必须引用模板,如果它匹配偏特化,将使用偏特化。

之后

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 * ,对吧?

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

关于c++ - 部分模板特化没有给出正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23403198/

相关文章:

c++ - 标准库中的operator==如何将字符串隐式转换为string_view?

c++ - C++ 标准的哪一部分要求 set::erase 立即调用析构函数

c++ - 编译器如何决定调用哪个函数模板?

c++ - 如何使用 Boost Filesystem 忽略隐藏文件(和隐藏目录中的文件)?

c++ - 模板功能的小烦恼

C++,函数参数的多态性与模板化

c++ - 用最近定义的结构替换前向声明的结构

c++: cin.getline 在一个单独的案例中被忽略

c++ - 如何通过调用类中的函数来创建线程?

c++ - loop-malloc.c : No such file or directory vector 中的段错误