-1

我正在编写一个需要一个表的程序,我正在使用一个向量数组来模拟它,我已经制作了一个自定义类来创建表。但是我看不到类表中的任何项目,除了 vec_data。为什么我无法访问此类中的公共成员?由于某种原因,MSVC++ Intellisense 只能看到 vec_data,没有别的。

template<class T>
class table
{
  private:
    T* vec_data;// initialize T

    struct tblarray : public T
    {
       std::vector<T> vecTbl[];
       bool operator[](unsigned int i) { return vecTbl[i]; } //redefine operator[] to accept unsigned int
       static void operator new(double n) //redefine new operator
       {
          void *d;
          if(n < 0) throw std::exception("Invalid Allocation to Negative number!");
          if(assert((d=malloc(n)) != 0) = 0) throw std::bad_alloc;
          return d;
      }
      void operator delete(void *d) //redefine delete operator
      {
        if(assert((free(p))) = 0) throw std::exception("Invalid Free of specified data!");
      }
      tblarray(const T&, unsigned int size) : T //one constructor
      {
        vecTbl = this.new std::vector<T>[reinterpret_cast<double>(size)];
      }
      ~tblarray() //one destructor
      {
        this.delete(vecTbl);
      }
}
public:
  table(const T&, unsigned int size) : T
  {
      this.tblarray.tblarray(T, size);
  }
  ~table()
  {
      this.tblarray.~tblarray();
  }
}

例如:

table<int> tblOne; //legal
table.table(int, 123); //not legal(probably not legal anyways, but intellisense says the function does not exist?)
4

3 回答 3

3

如果这是您的真实代码,那么您有一些小错误:

  • 在 C++ 中,每个类(包括结构和联合)都必须使用 终止;,但您不能tblarray使用终止;

  • 据我所见,在你的模板实例化中,Tint,而是tblarray从T派生的,想想你能有struct test : int吗?

  • 您的所有属性(您没有任何功能:变量:vec_data和类型:)tblarray都是私有的,那么您想如何访问它们?

  • 在 C++this中是指针而不是引用,因此您必须替换this.this->

  • 为了访问您的专业运算符,请使用保留字operator转换this.delete(vecTbl)operator delete(vecTbl)(这也不是一个好习惯,operator delete声明删除您的类的实例而不是它的成员!)

  • table是你的类的构造函数,所以当你想实例化你的变量时应该使用它:table<...> t(1, 100)并且由于你声明了一个非默认构造函数并且你没有默认构造函数,所以你不能拥有table<...> t它,因为它需要一个默认构造函数。

于 2012-10-16T19:00:03.867 回答
0

您在 struct 声明后错过了分号:

template<class T>
class table
{
private:
    T* vec_data;// initialize T

    struct tblarray
    {
        std::vector<T> vecTbl[];
        bool operator[](unsigned int i) { return vecTbl[i]; } //redefine operator[] to accept unsigned int
        static void operator new(double n) //redefine new operator
        {
            void *d;
            if(n < 0) throw std::exception("Invalid Allocation to Negative number!");
            if(assert((d=malloc(n)) != 0) = 0) throw std::bad_alloc;
            return d;
        }
        void operator delete(void *d) //redefine delete operator
        {
            if(assert((free(p))) = 0) throw std::exception("Invalid Free of specified data!");
        }
        tblarray(const T&, unsigned int size) : T //one constructor
        {
            vecTbl = this.new std::vector<T>[reinterpret_cast<double>(size)];
        }
        ~tblarray() //one destructor
        {
            this.delete(vecTbl);
        }
    };
public:
    table(const T&, unsigned int size) : T
    {
        this.tblarray.tblarray(T, size);
    }
    ~table()
    {
        this.tblarray.~tblarray();
    }
}

这里也是实例化:

int j = 1;
table<int> t(j, 2);

顺便说一句,ctor 中的 const T& 是多余的,模板参数中已经替换了类型

于 2012-10-16T18:53:45.983 回答
0

table.table(1,123)是非法的。您不能这样调用构造函数。

于 2012-10-16T18:48:28.880 回答