2

ベクター コンテナーに保持されているポインターが指すオブジェクト (ベクターと呼ばれる) にアクセスしようとしていますが、アクセスできないようです。

重要なコード スニペットを次に示します。

int main{
    Vector<double>* test = new Vector<double>(randvec<double>());

    test->save();

    cout << Element::vectors[0];
return 0;
}

はテンプレートVectorクラスで、ベクトルへのrandvec<T>()参照を返します。save()

template <class T>
void Vector<T>::save()
{
    vectors.push_back(this);
}

ベクトルは、ベクトルstatic std::vector<Element*> vectors;の基本クラスである Element.h で定義されます。

私はこれについてすべて間違っていますか?メイン クラスへのポインターのベクトルを使用して、基本クラスの静的データ メンバーに派生クラスのすべての要素を含めようとしています。

main() からの私の出力は、何が起こっているかを教えてくれるかもしれません – 私はポインタを取得します0x1001000a0。ただし、そのポインターを逆参照しようとすると、次のエラーが発生します。

error: no match for 'operator<<' in 'std::cout << * Element::vectors. 
std::vector<_Tp, _Alloc>::operator[] [with _Tp = Element*, _Alloc = std::allocator<Element*>](0ul)'

このポインターを逆参照できないのはなぜですか?

4

2 に答える 2

2

問題は逆参照ではありません。問題は、"<<" 演算子が Element::vectors に定義されていないことです

于 2010-06-22T04:30:27.277 に答える
1

operator<<を出力するために使用できるオーバーロードが不足しているようですElementVector<T>逆参照Element::vectors[0]により type のオブジェクトが得られるため、オーバーロードを定義しただけでは機能しないことに注意してくださいElement

Vector<T>派生クラス ( など) が のストリーム挿入動作をオーバーライドできるようにする方法の (未テスト、申し訳ありませんが) 例を次に示しますElement

に仮想メンバー関数を追加しますElement

class Element
{
   // other stuff

   virtual void write_to_stream(std::ostream& stream) const = 0;
};

この関数を呼び出すoperator<<ためのオーバーロード:Element

std::ostream& operator<<(std::ostream& stream, const Element& element)
{
    element.write_to_stream(stream);  // dynamic dispatch as we call through reference
    return stream;
}

次に、派生クラスの仮想メンバー関数をオーバーライドして、記述方法を制御します。

template<class T>
class Vector : public Element
{
   // other stuff
   virtual void write_to_stream(std::ostream& stream) const
   {
      // whatever you like goes here
   }
};
于 2010-06-22T04:32:05.713 に答える