该问题是您在this thread上找到的上一个问题的基础。
我试图在模板体系结构的顶部添加一些多态性,但没有成功(请参见下面的代码和编译错误)。

我试图根据编译错误将问题与其他问题联系在一起,但没有成功。我在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'

最佳答案



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>要求T具有SubSpeciesEnum,而FishEnum::SubSpeciesEnum没有。

关于c++ - 模板类的dynamic_cast出现编译错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56600574/

10-11 19:04