#include <iostream>
#include <string>
template<typename T>
class animal
{
public:
std::string print()
{
return static_cast<T*>(this)->impl_print();
};
protected:
inline const static std::string verb = "says ";
};
template<typename T>
class pet : public animal<pet<T>>
{
public:
std::string impl_print()
{
return verb + static_cast<T*>(this)->impl_print();
};
inline const static std::string excite = "!";
};
class cat : public pet<cat>
{
public:
std::string impl_print()
{
return "meow" + excite;
};
};
class dog : public pet<dog>
{
public:
std::string impl_print()
{
return "WOOF" + excite;
};
};
int main()
{
cat a;
dog c;
std::cout<<a.print()<<std::endl;
std::cout<<c.print()<<std::endl;
return 0;
}
Isso gera um erro " 'verbo' não foi declarado neste escopo". Por que as classes no final da cadeia CRTP são capazes de acessar variáveis declaradas pelo pai, mas a classe média não pode acessar uma variável declarada pelo seu próprio pai?
Testado com gcc13.
Porque seu pai depende do parâmetro do modelo. Não se sabe o que você quis dizer com id
verb
- uma variável global ou um membro de classe, que formalmente não foi declarado neste modelo de classe. Pode haver uma especializaçãoanimal
que poderia ser definidaverb
de forma diferente antes da instanciação. Usarthis->
irá consertar isso.