类外定义矩阵的维度参数作用域相关技术问题
C++静态成员数组定义相关问题
示例代码
class C { static const int dim = 3; static const int matrix[dim][dim]; }; int dim = -2; const int C::matrix[dim][C::dim] = {{1,2,3}, {1,2,3}, {1,2,3}};
问题解答
1. 为何必须再次指定该矩阵的维度?
类内的static const int matrix[dim][dim]只是成员声明,仅告知编译器这个静态数组成员的存在,并未为其分配内存。而在类外定义静态成员时,必须提供完整的类型信息——数组的大小是类型的核心组成部分,即使类内已经用dim指定了维度,定义阶段仍需显式写出(哪怕复用类内的dim),这是C++对数组定义的语法强制要求:数组定义时的大小必须是编译期可知的常量表达式,且必须明确出现在定义的类型声明中,才能让编译器确定要分配的内存大小。
2. 为何第一个dim的值为3而非-2?
这是C++的名字查找规则决定的:在定义类的静态成员C::matrix时,当前上下文属于类C的成员定义域,编译器会优先查找类作用域内的名字。全局作用域的int dim = -2是普通变量,不仅优先级低于类成员的dim,而且它是运行期变量,不符合数组维度必须是编译期常量的要求。因此第一个dim会被解析为C::dim,值为3。
内容的提问来源于stack exchange,提问作者ChristmasTree
相关产品推荐
相关产品推荐

