关于矩阵类型命名模板定义的语法问题
关于矩阵类型命名模板定义的语法问题
兄弟,我来给你捋捋问题出在哪哈~
你现在的问题核心是:你误以为自己定义了一个模板类型,但实际上写的是个模板变量声明,这俩完全不是一回事!
先看你原来的代码:
template <typename T> vector< vector<T> > matrix;
这段代码编译通过是因为它是合法的——它声明了一个模板变量:对每个类型T,都存在一个vector<vector<T>>类型的全局变量matrix,但它不是一个类型名,所以你后面写typedef matrix<int> imat;的时候,编译器肯定会报错说matrix<int>不是类型,因为matrix根本就不是模板类型呀!
那正确的写法该咋整?分两种情况:
情况1:用C++11及以后的版本(推荐)
用using来定义模板别名,这是C++11引入的特性,写法直接且直观:
#include <vector> // 先定义模板别名matrix,它代表vector<vector<T>>这个类型 template <typename T> using matrix = std::vector<std::vector<T>>; // 接下来不管用typedef还是using都能起别名 typedef matrix<int> imat; // 或者C++11更推荐的:using imat = matrix<int>; // 然后你要的用法就完全没问题了 imat M(3); // 生成包含3个空vector<int>的矩阵
情况2:兼容C++03的老版本
如果还得支持C++03(现在很少见,但还是提一嘴),可以用一个模板结构体来包装类型:
#include <vector> template <typename T> struct matrix { // 在结构体里定义类型别名 typedef std::vector<std::vector<T>> type; }; // 用的时候要取结构体里的type成员 typedef matrix<int>::type imat; imat M(3);
这样改完之后,你想要的imat M(3)就能正常工作,生成3个空行的矩阵啦~
内容来源于stack exchange
相关产品推荐
相关产品推荐

