我正在尝试访问由向量容器中的指针指向的对象(称为Vector),但我似乎无法达到它。
以下是重要的代码段:
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中定义,它是Vectors的基类。
我是否认为这一切都错了?我试图通过使用指向主类的指针向量来包含基类的静态数据成员中派生类的所有元素。
我的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)'
为什么我不能取消引用这个指针?
答案 0 :(得分:2)
问题不在于解除引用。问题是“&lt;&lt;&lt;没有为Element :: vectors
定义operator答案 1 :(得分:1)
您似乎错过了可用于输出operator<<
的{{1}}重载。请注意,如果您只为Element
定义重载,它将无效,因为解除引用Vector<T>
会为您提供类型为Element::vectors[0]
的对象。
这是一个(未经测试的,抱歉的)示例,说明如何允许派生类(如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;
}