-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、は ですが、tblarrayT から派生したもので、考えてみて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

構造体宣言後にセミコロンを見逃しました:

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 に答える