C++类模板Mat使用报错:需模板实参,函数原型无法推导
问题分析与解决:带非类型模板参数的Mat结构体打印函数编译错误
错误原因
- 直接使用
Mat作为函数参数类型:Mat是类模板而非具体类型,必须指定模板参数才能生成可实例化的类型。C++不允许在函数参数列表中直接用未指定参数的类模板让编译器自动推导非类型参数。 - 错误使用
Mat<int, int>:Mat的模板参数是非类型模板参数,要求传入编译期常量值(比如3、5这类具体数字),而int是类型而非常量值,编译器无法据此实例化模板。
解决方法
将show函数也定义为模板函数,让它适配任意nrow和ncol的Mat实例,编译器会根据传入的对象自动推导模板参数值:
template <int nrow, int ncol> void show(const Mat<nrow, ncol>& mat) { for(size_t row = 0; row < mat.row_size; ++row) { for(size_t col = 0; col < mat.col_size; ++col) { std::cout << mat.mat[row][col] << " "; } std::cout << "\n"; // 添加换行优化输出格式 } }
完整使用示例
#include <iostream> #include <array> template <int nrow, int ncol> struct Mat{ int row_size = nrow; int col_size = ncol; std::array<std::array<float, ncol>, nrow> mat; }; template <int nrow, int ncol> void show(const Mat<nrow, ncol>& mat) { for(size_t row = 0; row < mat.row_size; ++row) { for(size_t col = 0; col < mat.col_size; ++col) { std::cout << mat.mat[row][col] << " "; } std::cout << "\n"; } } int main() { Mat<2,3> my_mat; // 初始化矩阵值 my_mat.mat[0] = {1.0f, 2.0f, 3.0f}; my_mat.mat[1] = {4.0f, 5.0f, 6.0f}; // 调用打印函数,编译器自动推导nrow=2,ncol=3 show(my_mat); return 0; }
修改后,编译器会根据传入的Mat实例自动生成对应参数的show函数版本,可完美适配不同尺寸的矩阵。
内容的提问来源于stack exchange,提问作者MOON
相关产品推荐
相关产品推荐

