Основы шаблонов C ++ - функция Accept Sub Class или Super - PullRequest
0 голосов
/ 23 сентября 2010

Скажем, у вас есть подкласс B, который наследуется от суперкласса A. Вам нужна функция, которая может принимать A или B.

template <typename T>
void someFunc(T* pObj, bool someOtherArg)
{
    pObj->AnInheritMethod();
    if (pObj->IsASub())
    {
       pObj->ANonInhertMethod();
    }
}

Когда я компилирую это (Visual Studio 6), я получаю:

error C2065: 'pObj' : undeclared identifier

Я здесь далеко от базы?

Ответы [ 3 ]

2 голосов
/ 23 сентября 2010

Вам не нужен шаблон функции для этого; следующее будет хорошо:

void someFunc(A* pObj)
{
    pObj->AnInheritMethod();
    if (B* pObjAsB = dynamic_cast<B*>(pObj))
    {
        pObjAsB->ANonInheritMethod();
    }
}

Или, если вы предпочитаете использовать функцию-член IsASub() вместо dynamic_cast:

void someFunc(A* pObj)
{
    pObj->AnInheritMethod();
    if (pObj->IsASub())
    {
        B* pObjAsB = static_cast<B*>(pObj);
        pObjAsB->ANonInheritMethod();
    }
}

Помимо отсутствующего возвращаемого типа, я не вижу ничего явно неправильного в коде в вашем примере; У меня не установлен Visual C ++ 6 для проверки.

2 голосов
/ 23 сентября 2010

Для этого вам не нужны шаблоны, это бесплатное поведение из-за полиморфизма.

Редактировать: также если вы напишите что-то вроде:

if (pObj->IsASub())

тогда, возможно, что-то не так в вашем дизайне. Предполагается, что метод работает для любого типа в цепочке деривации.

1 голос
/ 23 сентября 2010

Вы задаете вопрос, который совершенно не связан с кодом и ошибкой, которую вы включили.

Чтобы функция взяла A или класс, производный от A, все, что ей нужно сделать, это взять указатель или ссылку на A, например,

someFunc(A* pObj, bool someOtherArg);

или

someFunc(A& obj, bool someOtherArg);

Это будет работать в силу наследования. В этом вся суть получения классов друг от друга. Как вы написали его с помощью шаблонов, он будет работать с любым классом, который определяет три метода, которые вы используете, независимо от того, получен он из A.

Теперь опубликованная вами ошибка не связана с этим вопросом, но причудлива. В написанном вами коде нет ничего плохого, но Visual Studio 6 - древний компилятор; ему двенадцать лет, и он не полностью поддерживает современный стандарт ISO C ++. Эта ошибка может быть артефактом нестандартной реализации шаблонов в компиляторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...