模板类dynamic_cast的编译错误

Compilation error with a dynamic_cast of a template class

本文关键字:编译 错误 cast dynamic      更新时间:2023-10-16

这个问题是继您可以在此线程上找到的上一个问题之后。我试图在模板架构之上添加一些多态性,但没有任何成功(请参阅下面的代码和编译错误(。

我试图根据编译错误将问题与其他问题联系起来,但没有成功。我发现了 VC12 的"别名"定义问题,但 VC15 仍然存在问题。

通用动物

template <class T>
class GenericAnimal
{
public:
    bool InstantiateAnimal(typename T::SubSpeciesEnum value);
private:
    T _attributes;
};
template <class T>
bool GenericAnimal<T>::InstantiateAnimal(typename T::SubSpeciesEnum value)
{
    AnimalAttributes<typename T::SubSpeciesEnum>& attributes = dynamic_cast<AnimalAttributes<typename T::SubSpeciesEnum>&> (_attributes);
    //int ID = attributes.InstantiateAnimal(value);
    //bool ret = ID != -1;
    bool ret = true;
    return ret;
}

动物属性

template <class EnumClass>
class AnimalAttributes : public EnumClass {
public:
    using typename EnumClass::SubSpeciesEnum;
    virtual int InstantiateAnimal(typename EnumClass::SubSpeciesEnum subSpecies) = 0;
};

鱼埃努姆

class FishEnum
{
public:
    enum SubSpeciesEnum {
        Cod, Salmon, Carp
    };
};

#include "AnimalAttributes.h"
#include "FishEnum.h"
class Fish : public AnimalAttributes<FishEnum>
{
public:
    Fish();
    int InstantiateAnimal(FishEnum::SubSpeciesEnum subSpecies);
};
Fish::Fish()
{
}
int Fish::InstantiateAnimal(FishEnum::SubSpeciesEnum subSpecies)
{
    int ID = -1;
    // NB: no code for real instantiation [yet]
    switch (subSpecies)
    {
        case FishEnum::Carp:
        {
            ID = 0;
            break;
        }
        case FishEnum::Cod:
        {
            ID = 1;
            break;
        }
        case FishEnum::Salmon:
        {
            ID = 2;
            break;
        }
    }
    return ID;
}

以下编译错误:

Erreur  C2516   'EnumClass' : classe de base non conform
Erreur  C2838   'SubSpeciesEnum' : nom qualifié non conforme dans une déclaration de membre 
Erreur  C2873   'SubSpeciesEnum' : un symbole ne peut pas être utilisé dans une déclaration using   
Erreur  C2838   'SubSpeciesEnum' : nom qualifié non conforme dans une déclaration de membre
Erreur  C2061   erreur de syntaxe : identificateur 'SubSpeciesEnum' 

in

template <class T>
bool GenericAnimal<T>::InstantiateAnimal(typename T::SubSpeciesEnum value)
{
    AnimalAttributes<typename T::SubSpeciesEnum>& attributes = dynamic_cast<AnimalAttributes<typename T::SubSpeciesEnum>&> (_attributes);
    int ID = attributes.InstantiateAnimal(value);
    bool ret = ID != -1;
    return ret;
}

T = Fish 时,您有:

T::SubSpeciesEnum = FishEnum::SubSpeciesEnum(枚举(。

所以AnimalAttributes<typename T::SubSpeciesEnum> AnimalAttributes<FishEnum::SubSpeciesEnum>.

AnimalAttributes<T>要求TSubSpeciesEnum,而FishEnum::SubSpeciesEnum没有。