1

クラスコンテナがあるとしましょう:

template<class T, int size>
class container
{
private:
    T* data;
    int length;
public:
    container()
    {
        data=new T[size];
        length=size;
    }
    ~container()
    {
        if(length>0)
            delete[] data;
    }
    container& operator= (container<T,size> c)
    {
        if(length>0)
           delete[] data;
        data=new T[c.length];
        length=c.length;
        for(int i=0; i<length; i++)
            data[i]=c.data[i];
        return *this;
    }
};

問題は、サイズの異なる 2 つのコンテナーがある場合、= 演算子を使用して一方を他方に割り当てることができないことです。例:

container<int,4> c1;
container<int,5> c2;
c1=c2;  // syntax error: 4!=5

C++11 配列などのクラスでは、これを行うことができます。
どうやってするか?

4

3 に答える 3

2

テンプレートとは、コンパイラがクラスを作成するために使用するテンプレートであり、クラス自体ではありません。

したがって、container<int,4>container<int,5>は完全に別のクラスであり、すべてのアクセス制限が含まれています。

特に、これはcontainer<int, 4>の代入演算子が のメンバーにアクセスできないことprivateを意味しますcontainer<int,5>

これを回避するには、いくつかの方法があります。

  • 他の人が指摘したように、メモリを動的に割り当てているように見えるため、サイズ テンプレート引数を削除します。そのため、コンパイル時にサイズを特定しても値が追加されず、代入演算子が別の結果になる可能性があるため、実際には誤解を招く可能性があります。宣言されたサイズよりも。
  • containerのパブリック インターフェイスに関して代入演算子を実装します。
  • 次の行をクラスに追加してcontainer、同じタイプのすべてのクラスを宣言します。friends

コード:

template<class U, int otherSize> friend class Foo;

次のように代入演算子を宣言します。

template <int otherSize>
container<T,size>& operator=(container<T,otherSize> c);
于 2012-07-25T18:02:00.053 に答える
1

割り当てるコンテナのサイズで割り当て演算子をパラメータ化する必要があります(投稿されたコードに関する他の問題は無視します)。

    template <int otherSize>
    container& operator= (container<T,otherSize> c)
    {
        if(length>0)
           delete[] data;
        data=new T[otherSize];
        length=otherSize;
        for(int i=0; i<otherSize; i++)
            data[i]=c.data[i];
        return *this;
    }
于 2012-07-25T17:27:47.990 に答える
0

コメント者が指摘したように、初期サイズをテンプレート パラメータにすることは間違っているように見え、問題の原因です。

ただし、互換性のない2つのコンテナから割り当てるという一般的な質問を考慮すると、operator=tumdumの回答が示すようにテンプレートを作成できますが、コンテナを別のわずかに異なるタイプから埋めたい場合は役に立ちません。

標準コンテナは、イテレータのペアで定義された範囲からの構築と割り当てを許可することで問題を解決します。

template<typename FwdIter>
  container(FwdIter begin, FwdIter end)
  {
    data=new T[length = std::distance(begin, end)];
    std::copy(begin, end, data);
  }

template<typename FwdIter>
  void
  assign(FwdIter begin, FwdIter end)
  {
    container(begin, end).swap(*this);
  }

void swap(container& c)
{
  std::swap(data, c.data);
  std::swap(length, c.length);
}

iterator begin() { return data; }
const_iterator begin() const { return data; }
const_iterator cbegin() const { return data; }
iterator end() { return data+size; }
const_iterator end() const { return data+size; }
const_iterator cend() const { return data+size; }

これで、次のことができます。

container<int,4> c1;
container<int,5> c2;
c1.assign(c2.begin(), c2.end());
于 2012-07-25T17:51:17.127 に答える