当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 6 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [问题]一个C++编译问题,调得我快崩溃了,是在不知道错在哪里,期待牛人帮忙
帖子发表于 : 2008-02-01 16:04 
头像

注册: 2007-04-18 3:09
帖子: 43
地址: UESTC
送出感谢: 0 次
接收感谢: 0 次
以下是array.h的全部代码,为什么通不过编译呢?
代码:
#ifndef ARRAY_H
#define ARRAY_H

template<class T>
class Array{
protected:
   T* data;
   unsigned int base;
   unsigned int length;
public:
   Array();
   Array(unsigned int len,unsigned int base);
   ~Array();
   Array(const Array& arr);
   Array& operator = (const Array& arr);
   T& operator [] (unsigned int index) const;
   const T* Data() const;
   unsigned int Base() const;
   unsigned int Length() const;
   void SetBase(unsigned int newbase);
   void SetLength(unsigned int newlength);
   void CopyTo(Array&) const;
};

template<class T>
Array<T>::Array() :
   data(new T[1]),
   base(0),
   length(0)
{}

template<class T>
Array<T>::Array(unsigned int len,unsigned int base = 0) :
   data(new T[len]),
   base(base),
   length(len)
{}

template<class T>
Array<T>::Array(const Array<T>& arr):
   data(new T[arr.length]),
   base(arr.base),
   length(arr.lenth)
{
   for(unsigned int i = 0; i< length;i++)
      data[i] = arr.data[i];
}

template<class T>
Array<T>::~Array()
{
   delete [] data;
}

template<class T>
const T* Array<T>::Data() const
{
   return data;
}

template<class T>
unsigned int Array<T>::Base() const
{
   return base;
}

template<class T>
unsigned int Array<T>::Length() const
{
   return length;
}

template<class T>
T& Array<T>::operator [] (unsigned int index) const
{
   unsigned int const offset = index - base;
      if(offset >= length)
         throw ("invalid array index!\n");
   return data[offset];
}

template<class T>
void Array<T>::SetBase(unsigned int newbase)
{
   this->base = newbase;
}

template<class T>
void Array<T>::SetLength(unsigned int newlength)
{
   T* newData = new T[newlength];
   unsigned int const min = length < newlength ? length : newlength;
   for(unsigned int i = 0; i < min; i++)
      newData[i] = data[i];
   delete [] data;
   data = newData;
   length = newlength;
}

template<class T>
void Array<T>::CopyTo(Array<T>& array) const{
   unsigned int tmp = array.Base();
   array.SetBase(this->Base());
   array.SetLength(this->Length());
   for(unsigned int i = 0; i<this->length; i++)
      array[i] = this->data[i];
   array.SetBase(tmp);
}

/**
 * Array2D
 */
template<class T>
class Array2D{
protected:
   unsigned int numberOfRows;
   unsigned int numberOfColumns;
   Array<T> array;
public:
   class Row{
      Array2D& array2D;
      unsigned int const row;
   public:
      Row(Array2D& _array2D,unsigned int _row) : array2D(_array2D),row(_row) {}
      T& operator[] (unsigned int column) const{   return array2D.Select(row,column);}
   };
   Array2D(unsigned int,unsigned int);
   T& Select(unsigned int,unsigned int);
   Row operator[] (unsigned int);
};

template<class T>
Array2D<T>::Array2D(unsigned int m,unsigned int n) : numberOfRows(m),numberOfColumns(n),array(m*n) {}
template<class T>
T& Array2D<T>::Select(unsigned int i,unsigned int j){
   if(i >= this->numberOfRows)
      throw "invalid row.";
   if(j >= this->numberOfColumns)
      throw "invalid column.";
   return array[i*this->numberOfColumns + j];
}


template<class T>
Array2D<T>::Row Array2D<T>::operator [](unsigned int row){
   return Row(*this,row);
}

/**
 * class Matrix
 */
template<class T>
class Matrix : public Array2D<T>{
public:
   Matrix(unsigned int,unsigned int);
   Matrix operator * (const Matrix&) const;
   Matrix operator + (const Matrix&) const;
};

template<class T>
Matrix<T>::Matrix(unsigned int m,unsigned int n) : numberOfRows(m),numberOfColumns(n),array2D(m*n) {}

template<class T>
Matrix<T> Matrix<T>::operator * (const Matrix& arg) const{
   if(this->numberOfColumns != arg.numberOfRows)
      throw "incompatible matrices.";
   Matrix<T> result(this->numberOfRows,arg.numberOfColumns);
   for(unsigned int i = 0; i < this->numberOfRows; i++){
      for(unsigned int j = 0; j < arg.numberOfColumns; j++){
         T sum = 0;
         for(unsigned int k = 0; k < this->numberOfColumns; k++)
            sum += (*this)[i][k] * arg[k][j];
         result[i][j] = sum;
      }
   }
   return result;
}
template<class T>
Matrix<T> Matrix<T>::operator + (const Matrix& arg) const{
   if(this->numberOfColumns != arg.numberOfColumns || this->numberOfRows != arg.numberOfRows)
      throw "incompatible matrices.";
   Matrix<T> result(this->numberOfRows,this->numberOfColumns);
   for(unsigned int i = 0; i < this->numberOfRows; i++){
      for(unsigned int j = 0; j < this->numberOfColumns; j++)         
         result[i][j] = (*this)[i][j] + arg[i][j];
   }
   return result;
}
#endif


主函数非常简单,什么都不做,但以上代码就是没办法通过编译
代码:
#include "array.h"
int main()
{
      return 0;
}

在这个函数
代码:
template<class T>
Array2D<T>::Row Array2D<T>::operator [](unsigned int row){
   return Row(*this,row);
}

错误提示为:array.h:145: error: expected constructor, destructor, or type conversion before ‘Array2D’
在这个地方
代码:
Matrix<T>::Matrix(unsigned int m,unsigned int n) : numberOfRows(m),numberOfColumns(n),array2D(m*n) {}

错误提示为:
array.h: In constructor ‘Matrix<T>::Matrix(unsigned int, unsigned int)’:
array.h:161: error: class ‘Matrix<T>’ does not have any field named ‘numberOfRows’
array.h:161: error: class ‘Matrix<T>’ does not have any field named ‘numberOfColumns’
array.h:161: error: class ‘Matrix<T>’ does not have any field named ‘array2D’
怎么看得莫名其妙的


最后由 roamer 编辑于 2008-02-01 16:12,总共编辑了 1 次

页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-02-01 16:11 
头像

注册: 2007-04-18 3:09
帖子: 43
地址: UESTC
送出感谢: 0 次
接收感谢: 0 次
不好意思代码有点多,但是不用看逻辑,为什么会统不过编译呢


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2008-02-02 8:43 
头像

注册: 2007-01-31 23:01
帖子: 61
地址: 慕尼黑
送出感谢: 0 次
接收感谢: 0 次
看看这样:
代码:
Matrix<T>::Matrix(unsigned int m,unsigned int n) : Array2D<T>::numberOfRows(m),Array2D<T>::numberOfColumns(n),Array2D<T>::array2D(m*n) {}


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2008-02-02 13:05 
头像

注册: 2007-04-18 3:09
帖子: 43
地址: UESTC
送出感谢: 0 次
接收感谢: 0 次
frank7258 写道:
看看这样:
代码:
Matrix<T>::Matrix(unsigned int m,unsigned int n) : Array2D<T>::numberOfRows(m),Array2D<T>::numberOfColumns(n),Array2D<T>::array2D(m*n) {}

首先谢谢你的热心:)
嗯,这样是可以的,也可以这样
代码:
Matrix<T>::Matrix(unsigned int row,unsigned int column) : Array2D<T>(row,column) {}

这样这里是没有问题了,不过在这里有问题
代码:
Row operator [] (unsigned int);

实在搞不懂后我把类Row放到外面
代码:
template <class T>
class Row
{
   Array2D<T>& array2D;
   unsigned int const row;
public:
   Row (Array2D<T>& _array2D, unsigned int _row) :  array2D (_array2D), row (_row) {}
   T& operator [] (unsigned int column) const  { return array2D.Select (row, column); }
};

这样似乎可以了,在visual studio 2005里面确实可以运行了,但是我转到liunx系统下发现Matrix类没有办法通过编译,两个运算符重载函数都报错说numberOfRows和numberOfColumns没有定义
这是怎么回事呢?


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2008-02-02 20:58 
头像

注册: 2007-01-31 23:01
帖子: 61
地址: 慕尼黑
送出感谢: 0 次
接收感谢: 0 次
Visual Studio 2005下你那种方法应该也是同不过编译的。要初始化的成员变量一定要存在阿,如果是父类的得说明的。你后来的那种方法是调用了父类的构造函数。

代码:
Row operator [] (unsigned int);


代码在哪里我都找不到。

这里出错有可能是你Row这个类没有复制构造函数。
代码:
Row::Row(Row&);

代码太多了,不高兴看了。[/code]


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2008-02-03 16:54 
头像

注册: 2006-12-02 12:25
帖子: 689
送出感谢: 0 次
接收感谢: 0 次
unsigned int const row;

Row(Array2D& _array2D,unsigned int _row) : array2D(_array2D),row(_row) {}

这两句有问题。


_________________
Titainium


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 6 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译