是否有这样的初始化数组的方法:
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&) [with TYPE = long int]
显然有问题,我不能传递vec3d&在这里。有什么解决办法吗?首先定义每个单独的向量似乎是一个解决方案。虽然会很混乱…
很抱歉我愚蠢的问题…也许这个帖子存在于某个地方,但我没有找到它。可能这个问题有一些特殊的名字我不知道-因此我不能谷歌它!"扩展初始化列表","类数组初始化"等等都没有效果…
解决方案:这里有一些后处理…也许是这样。Else遇到同样的问题:复制构造函数缺少"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[]做到了!
给定
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
参数,不能绑定到右值参数。
删除第77行到第81行。
编译器会为你生成一个很好的复制构造函数。
干杯,hth。
没有正确声明复制构造函数toCopyFrom参数需要为const:
vec3d<TYPE>( const vec3d<TYPE>& toCopyFrom)
编辑:现在,关于下标操作符的第二个问题:
基类中的下标操作符operator[]()
没有const
(即只读)语义。在复制构造函数中,您试图通过该下标操作符访问right
中的值。现在,将right
形参声明为const,这基本上意味着不允许更改right
的内部状态。由于operator[]()
函数不是const,语言的假设是该函数可以改变/改变right
的状态——这与right
的const性相冲突。实际上,该函数返回对类的内部成员变量的引用,这将允许该代码的客户端更改right
的内部状态!
const TYPE& operator[]( int right) const
注意-为了清楚起见,我个人将right
重命名为index
。
上面函数签名后面的const
为它提供了const访问语义,例如,当right
是const
时,可以调用x = right[n]
。返回类型的前导const仅仅意味着返回的type引用将是const,这就阻止了当right
是const时执行right[n] = x
。注意-当您添加函数时,函数的实现(函数体)应该看起来与现有的下标操作符相同。你没有提供,所以我不能写
总之,我建议你仔细阅读const和"const-正确性"的主题。