У меня есть следующие классы и методы:
//Base class
class Node {
public:
virtual ~Node() {};
Node() {};
private:
// Private things for my implementation.
};
class Element : public Node {
public:
// Returns the name of the element.
const xml::String &name() const {
return eleName;
}
static bool is_Element(const Node *base) {
Element *p = NULL;
p = dynamic_cast<Element*>(base);
return (p!=NULL);
}
static const Element *to_Element(const Node *base) {
return dynamic_cast<Element*>(base);
}
private:
s_namespace eleNamespace;
xml::String &eleName;
// Private things for my implementation.
};
Здесь, когда я выполняю динамическое приведение, выдается следующая ошибка компиляции. Как это исправить? Один из способов — просто удалить const
параметров. Но я не думаю, что это правильный метод.
oops.cpp: в статической функции-члене 'static bool xml::Element::is_Element(const xml::Node*)': oops.cpp:208:44: ошибка: не может dynamic_cast 'base' (типа 'const class xml ::Node*') для ввода 'class xml::Element*' (преобразование отбрасывает константность) oops.cpp: в статической функции-члене 'static const xml::Element* xml::Element::to_Element(const xml:: Node*)': oops.cpp:213:47: ошибка: невозможно dynamic_cast 'base' (типа 'const class xml::Node*') для типа 'class xml::Element*' (преобразование отбрасывает константность)
conversion casts away constness
. - person chris   schedule 03.03.2013const Element*
. Потому что приведение его кElement*
отбрасывает константность. - person Drew Dormann   schedule 03.03.2013dynamic_cast
для определения динамического типа объекта обычно является признаком плохого дизайна. Зачем вам знать, является ли вашNode
Element
? Вы должны иметь возможность использоватьElement
, как если бы это былNode
. - person Joseph Mansfield   schedule 03.03.2013is_Element
должно возвращатьp != NULL
, а неbase != NULL
. - person Pete Becker   schedule 03.03.2013