1

基本クラス(VectorRaw)と派生クラス(Vector)があります。

基本クラスのコンストラクターで演算子newを使用してメモリバッファーを作成し、派生クラスのコンストラクターでnewを配置して、要素を配置します。

基本クラスには、派生クラスのコンストラクターで問題が発生した場合にクリーンアップする仮想デストラクタがあります。

コンパイルしようとすると、エラーが発生します。基本クラスのすべてのメンバー(begin, end, end_of_reserved)が、すべての派生クラスの関数のスコープ外にあります。

私は何が間違っているのですか?

これが私のコードです:

template <typename T>
class VectorRaw {
protected:
    T * begin;
    T * end;
    T * end_of_reserved;

    VectorRaw(const size_t size) {
        begin = (T*) operator new (2 * size * sizeof(T));
        end = begin;
        end_of_reserved = begin + 2 * size;
    }
    virtual ~VectorRaw<T> () throw() {
        for (T * iter = begin; iter != end; ++iter) {
            iter->~T();
        }
        operator delete (begin);
        end_of_reserved = end = begin;
    }
};

template <typename T>
class Vector : public VectorRaw<T> {
public: 
    Vector(const size_t size, const T& value) : VectorRaw<T>(size) {
        for (end = begin; end != begin + size; ++end)
            {   
            new (end) T (value);
        }
    }
    bool Empty() const throw() {
        return (begin == end);
    }
};
4

1 に答える 1

5

this基本クラスはテンプレートクラスであるため、ポインタを介してメンバーにアクセスする必要があります。

template <typename T>
class Vector : public VectorRaw<T> {
public: 
    Vector(const size_t size, const T& value) : VectorRaw<T>(size) {
        for (this->end = begin; this->end != this->begin + size; ++this->end)
            {   
            new (this->end) T (value);
        }
    }
    bool Empty() const {
        return (this->begin == this->end);
    }

};

これは、テンプレートパラメータがわかるまで、これらの名前のルックアップを延期するために必要です。それはそれらを従属名にします。詳細については、この回答を参照してください。

于 2013-03-16T18:26:26.717 に答える