有没有办法像这样初始化一个数组:
static const vec3d<long> XI[Q] = {
vec3d<long>( 0, 0, 0 ),
vec3d<long>(-1, 0, 0 ), vec3d<long>( 0,-1, 0 ), vec3d<long>( 0, 0,-1 ),
vec3d<long>(-1,-1, 0 ), vec3d<long>(-1, 1, 0 ), vec3d<long>(-1, 0,-1 ), [etc]
};
其中
00039 template<typename TYPE>
00040 class vec3d : public vec<TYPE>{
00041 public:
00042
00049 vec3d() : vec<TYPE>( 0, 3 ){};
00057 vec3d( TYPE right ) : vec<TYPE>( right, 3 ){};
00065 vec3d( TYPE X_val, TYPE Y_val, TYPE Z_val ) : vec<TYPE>( 0, 3 ){
00066 this->val[0] = X_val;
00067 this->val[1] = Y_val;
00068 this->val[2] = Z_val;
00069 };
00077 vec3d( vec3d<TYPE>& right ) : vec<TYPE>( 0, 3 ){
00078 this->val[0] = right[0];
00079 this->val[1] = right[1];
00080 this->val[2] = right[2];
00081 }; [etc] };
和
00040 template<typename TYPE>
00041 class vec{
00042 public:
00047 TYPE *val;
00052 int dimension;
00053 public:
00060 vec();
00066 vec( TYPE right );
00073 vec( TYPE right, int _dimension );
00081 vec( vec<TYPE> &right );
00082
00087 ~vec();
00088
00089
00090 TYPE& operator[]( int right);
00091 vec<TYPE>& operator=( TYPE right );
00092 vec<TYPE>& operator=( vec<TYPE> &right );
[etc] };
来源是:
00049 template<typename TYPE>
00050 vec<TYPE>::vec( TYPE right, int _dimension ){
00051 dimension = _dimension;
00052 val = new TYPE[_dimension];
00053 assert( val );
00054 for( int i = 0; i < dimension; i++ ) val[i] = right;
00055
00056 };
00075 template<typename TYPE>
00076 TYPE& vec<TYPE>::operator[]( int right ){
00077 assert( ( right < dimension ) );
00078 assert( right >= 0 );
00079 assert( val );
00080 return val[right];
00081 };
是构造函数。 Q被声明为“static const int”,所以它应该满足C ++标准的非变量,对吗?
编译说: 错误:没有匹配函数来调用'albm :: vec3d :: vec3d(albm :: vec3d)' vec3d.h:77:2:注意:候选人是:albm :: vec3d :: vec3d(albm :: vec3d&amp;)[与TYPE = long int]
显然有问题,我无法通过vec3d&amp;这里。有一些解决方法吗?首先定义每个矢量似乎是一个解决方案。不过会是一阵骚扰......
抱歉我的愚蠢问题......也许这个线程存在于某处,但我没有找到它。可能这个问题有一些我不知道的特殊名称 - 因此我不能谷歌吧! “扩展初始化列表”,“类数组初始化”等都没有做到这一点......
解决方案:这里有一些后处理......也许是这样。否则遇到同样的问题: 复制构造函数缺少“const”:
00077 vec3d( const vec3d<TYPE>& right ) : vec<TYPE>( 0, 3 ){
00078 this->val[0] = right.val[0];
00079 this->val[1] = right.val[1];
00080 this->val[2] = right.val[2];
此外我无法直接访问[] - 我猜测的原因是模板样式 - 但是right.val []可以解决问题!
答案 0 :(得分:1)
鉴于
00039 template<typename TYPE>
00040 class vec3d : public vec<TYPE>{
00041 public:
00042
00049 vec3d() : vec<TYPE>( 0, 3 ){};
00057 vec3d( TYPE right ) : vec<TYPE>( right, 3 ){};
00065 vec3d( TYPE X_val, TYPE Y_val, TYPE Z_val ) : vec<TYPE>( 0, 3 ){
00066 this->val[0] = X_val;
00067 this->val[1] = Y_val;
00068 this->val[2] = Z_val;
00069 };
00077 vec3d( vec3d<TYPE>& right ) : vec<TYPE>( 0, 3 ){
00078 this->val[0] = right[0];
00079 this->val[1] = right[1];
00080 this->val[2] = right[2];
00081 }; [etc] };
第77行定义的复制构造函数具有非const
参数,不能绑定到rvalue参数。
只需删除第77到81行。
编译器将为您生成一个很好的复制构造函数。
干杯&amp;第h。,
答案 1 :(得分:0)
您的副本构造函数未正确声明 - toCopyFrom参数需要 const :
vec3d<TYPE>( const vec3d<TYPE>& toCopyFrom)
编辑:
现在,关于下标运算符的第二个问题:
基类中的下标运算符operator[]()
没有const
(即只读)语义。在您的复制构造函数中,您尝试通过该下标运算符访问right
中的值。现在,right
参数被声明为const,这基本上意味着不允许您更改right
的内部状态。由于你的operator[]()
函数不是const,语言的假设是函数可以改变/改变right
的状态 - 这与right
的常量冲突。实际上,该函数实际上返回对类的内部成员变量的引用,这将允许该代码的客户端更改right
的内部状态!
解决方案是在基类中提供一个额外的const,下标运算符:
const TYPE& operator[]( int right) const
注意 - 就个人而言,我将right
重命名为index
- 为了清晰起见。
上述函数签名上的尾随const
为其提供了const访问语义,当right[n]
为right
时,您可以调用 - 例如 - x = const
。返回类型的前导const仅表示返回的TYPE引用将为const,这会阻止在right[n] = x
为const时执行right
。注意 - 添加函数时,函数的实现(主体)应该与现有的下标运算符看起来相同。你没有提供,所以我不能写。
总之,我建议你阅读const和'const-correctness'主题。