C ++ Полиморфизм / Указатели - выражение должно иметь постоянное значение

0

Я новичок в полиморфизме и шаблонах в C++, и я пришел к ошибке: "выражение должно иметь постоянное значение" при использовании указателя Dad, в чем проблема?

#include <iostream>
class Animal{
public:
    std::string noise;
    virtual void speak(char* message){
        std::cout << message << " " << noise.c_str() << std::endl;
    }
};
template <Animal* Parent> class Baby : public Animal{
public:
    void speak(char* message){
        std::cout << message << " " << Parent->noise.c_str() << Parent->noise.c_str() << std::endl;
    }
};
int main(void){
    Animal Dog;
    Dog.noise = "WOOF";
    Animal* Dad = &Dog;
    Baby<Dad> puppy; // Error here
    Dad->speak("I am a dog");
    puppy.speak("I am a puppy");
    return (0);
}

Требуемый результат:

Я собака WOOF

Я щенок WOOFWOOF

Когда я попытался запустить, я получил ошибку: error C2971: 'Baby': template parameter 'Parent': 'Dad': a local variable cannot be used as a non-type argument

  • 0
    удалить template <Animal* Parent> и <Dad> . Вам не нужны шаблоны для использования полиморфизма.
  • 0
    @erenon - Но я бы хотела, чтобы у щенка был родитель
Теги:
pointers
templates
polymorphism

1 ответ

1
Лучший ответ

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

class Animal{
public:
    std::string noise;
    void speak(char* message)
    {
        std::cout << message << " " << noise.c_str() << std::endl;
    }
};
class Baby
{
public:
    Baby(Animal* parent) : parent_(parent) {}
    void speak(char* message)
    {
        std::cout << message << " " <<
        parent->noise.c_str() << parent->noise.c_str() << std::endl;
    }
private:
   Animal* parent_;
};

и вам не нужно наследование в этом случае.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню