无法推导模板参数T时,如何指定模板类型名?
解决模板参数推导失败问题
编译报错“couldn’t deduce template parameter ‘T’”的原因很直接:identity_matrix是模板函数,你调用时只传了size(一个无符号整数),编译器找不到任何能推导模板参数T的依据——函数参数里没有T类型的变量,仅返回值mat<T>无法作为推导依据。
下面是几种可行的解决方法:
方法一:显式指定模板参数
这是最直接的方案,调用时明确告诉编译器T的类型:
int main(int argc, char* argv[]) { mat<double> m = identity_matrix<double>(3); // 显式指定T为double return 0; }
方法二:给模板函数添加T类型的参数
修改identity_matrix,增加一个T类型的参数(可设默认值),让编译器能通过这个参数推导T:
template<typename T> mat<T> identity_matrix(unsigned int size, T default_val = T{}){ mat<T> m(size, size, default_val); for (unsigned int i=0; i<size; i++) { m[i][i] = static_cast<T>(1); } return m; } // 调用方式1:显式传T类型的值 mat<double> m1 = identity_matrix(3, 0.0); // 调用方式2:利用默认参数推导T mat<int> m2 = identity_matrix(5);
方法三:将identity_matrix改为mat类的静态成员函数
把生成单位矩阵的逻辑放到mat类内部作为静态成员,这样T的类型会由类的模板参数自动确定:
template<typename T> class mat { public: mat(){} mat(unsigned int r, unsigned int c, T value) : mat_(r) { for (unsigned int i=0; i<r; i++) mat_[i].resize(c); for (unsigned int i=0; i<r; i++) for (unsigned int j=0; j<c; j++) mat_[i][j] = value; } std::vector<T>& operator[](int r){return mat_[r];} // 添加静态成员函数生成单位矩阵 static mat identity_matrix(unsigned int size){ mat m(size, size, T{}); for (unsigned int i=0; i<size; i++) { m[i][i] = static_cast<T>(1); } return m; } private: std::vector<std::vector<T>> mat_; }; // 调用方式 int main(int argc, char* argv[]) { mat<double> m = mat<double>::identity_matrix(3); return 0; }
内容的提问来源于stack exchange,提问作者Antonella Longo
相关产品推荐
相关产品推荐

