0

有没有办法像这样初始化数组:

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&) [使用 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[] - 我的猜测是模板样式 - 但 right.val[] 可以解决问题!

4

2 回答 2

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没有参数,不能绑定到右值参数。

只需删除第 77 到 81 行。

编译器将为您生成一个不错的复制构造函数。

干杯&hth.,

于 2011-09-05T07:28:00.017 回答
0

您的复制构造函数未正确声明 - toCopyFrom 参数需要为const

vec3d<TYPE>( const vec3d<TYPE>& toCopyFrom)

编辑:

现在,关于下标运算符的第二个问题:

基类中的下标运算符operator[]()没有const(即只读)语义。在您的复制构造函数中,您试图right通过该下标运算符访问值。现在,该right参数被声明为 const,这基本上意味着您不允许更改right. 由于您的operator[]()函数不是 const,因此语言的假设是该函数可以改变/改变right- 的状态,这与right' 的 const-ness 冲突。实际上,该函数实际上返回对类的内部成员变量的引用,这将允许该代码的客户端更改right

解决方案是在基类中提供一个额外的 const 下标运算符:

const TYPE& operator[]( int right) const

注意 - 就个人而言,为了清楚起见,我会重命名rightindex- 。

上述函数签名的尾部const为其提供了 const 访问语义,允许您调用 - 例如 - x = right[n]when rightis const。返回类型上的前导 const 仅意味着返回的 TYPE 引用将是 const,这会阻止您在right[n] = x何时right为 const。注意 - 当您添加函数时,函数的实现(主体)可能看起来与现有下标运算符相同。你没有提供,所以我不能写。

总之,我建议您阅读 const 和“const-correctness”主题。

于 2011-09-05T07:27:39.757 回答