Я новичок в полиморфизме и шаблонах в 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
Вы не можете использовать локальный указатель как параметр шаблона, как указано в сообщении. Вы можете использовать что-то вроде
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_;
};
и вам не нужно наследование в этом случае.
template <Animal* Parent>
и<Dad>
. Вам не нужны шаблоны для использования полиморфизма.