从派生的模板类调用函数

时间:2010-06-20 16:29:52

标签: c++ inheritance templates derived-class

我的基类:

//Element.h
class Element
{
public:
Element();
virtual ~Element(){}; // not sure if I need this

virtual Element& plus(const Element&);
virtual Element& minus(const Element&);
};

派生模板类:

//Vector.h
#include "Element.h"

template <class T>
class Vector: public Element {
T x, y, z;

public:
//constructors
Vector();
Vector(const T& x, const T& y = 0, const T& z =0);
Vector(const Vector& u);
...     
//operations
Element& plus(const Element&) const;
Element& minus(const Element&) const;
...
};
...

//summation
template <class T>
Element& Vector<T>::plus(const Element& v) const
{
const Vector<T>& w = static_cast<const Vector<T>&>(v);  
Vector<T>* ret = new Vector<T>((x + w.x), (y + w.y), (z + w.z));
return *ret;
}

//difference
template <class T>
Element& Vector<T>::minus(const Element& v) const
{
const Vector<T>& w = static_cast<const Vector<T>&>(v);
Vector<T>* ret = new Vector<T>((x - w.x), (y - w.y), (z - w.z));
return *ret;
}

我对此代码有另一个问题(在another post中回答),但目前我正在努力解决这样一个事实:如果我尝试运行此代码,我会得到

  

未定义的符号:    “Element :: plus(Element const&amp;)”,引自:        Vectorin main.o的vtable    “Element :: Element()”,引自:        在main.o中的Vector :: Vector()        在main.o中的Vector :: Vector(双const&amp;,双const&amp;,双const&amp;)    “Element :: minus(Element const&amp;)”,引自:        Vectorin main.o的vtable    “metainfo for Element”,引自:        Vectorin main.o的typeinfo   ld:未找到符号
  collect2:ld返回1退出状态

这是因为派生的模板类没有与基类放在同一个文件中,这会导致编译器问题(类似于我在头文件中定义整个Vector类的方式)?

我是C ++的新手,还在阅读vtable是什么以及它们是如何工作的,但是我还不能理解这一点。

3 个答案:

答案 0 :(得分:3)

如果我理解得很好,你想要一个抽象的“元素”,并从“元素”派生出“矢量”。在这种情况下,您应该删除“Element”构造函数,并通过在声明末尾添加“= 0”将“plus”和“minus”声明为纯虚拟。但是你的析构函数很好。

这就是所有的错误消息:当你在Element中声明构造函数和一些方法时,你最终调用它们,链接器会查找它们。

我觉得你希望你的Vector类在Vector上实现“加”和“减”,而不是在抽象元素上实现。这样,您就不需要静态强制转换。你也可以避免一个充满痛苦的世界,因为你的返回类型会有很大的切割风险。

答案 1 :(得分:1)

这与Vector无关。您在virtual Element& plus(const Element&)声明方法,例如Element::Element()Element.h,但您必须在某处定义,大概在{{1} }。如果你已经完成了这个并且你仍然遇到这个错误,那几乎肯定意味着你没有将Element.o链接到你的可执行文件中,所以链接器根本不知道在Element.cc时放入什么(或其他任何东西)调用这些方法。

答案 2 :(得分:1)

我认为编译器/链接器在它告诉你Undefined symbols: "Element::plus(Element const&)"时就意味着它。这些符号(元素的加号和减号)已经声明,但尚未定义。