Почему static_cast от Pointer to Base к Pointer to Derived «недействителен»? - PullRequest
6 голосов
/ 27 апреля 2011

Итак, у меня есть этот код:

Node* SceneGraph::getFirstNodeWithGroupID(const int groupID)
{
    return static_cast<Node*>(mTree->getNode(groupID));
}

mTree-> getNode (groupID) возвращает PCSNode *. Узел публично получен из PCSNode.

Все документы, которые я нашел в static_cast, что-то говорят об этом: «Оператор static_cast можно использовать для таких операций, как преобразование указателя в базовый класс в указатель на производный класс».

Тем не менее, компилятор XCode (GCC) сообщает, что static_cast от PCSNode * до Node * недопустим и не разрешен.

Есть причина, почему это так? Когда я переключаю его на приведение в стиле C, компилятор не жалуется.

Спасибо.

ОБНОВЛЕНИЕ: Несмотря на то, что на вопрос был дан ответ, я опубликую ошибку компилятора для полноты на случай, если у кого-то еще возникнет такая же проблема:

ошибка: семантическая проблема: Static_cast с 'PCSNode *' на 'Node *' не является разрешено

1 Ответ

23 голосов
/ 27 апреля 2011

Причина, скорее всего, в том, что определение Node невидимо для компилятора (например, оно могло быть только объявлено заранее: class Node;).

Автономный пример:

class Base {};

class Derived; // forward declaration

Base b;

Derived * foo() {
    return static_cast<Derived*>( &b ); // error: invalid cast
}

class Derived : public Base {}; // full definition

Derived * foo2() {
    return static_cast<Derived*>( &b ); // ok
}
...