模板类的dynamic_cast出现编译错误

时间:2019-06-14 14:50:15

标签: c++ templates

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

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

GenericAnimal

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;
}

AnimalAttributes

template <class EnumClass>
class AnimalAttributes : public EnumClass {
public:
    using typename EnumClass::SubSpeciesEnum;

    virtual int InstantiateAnimal(typename EnumClass::SubSpeciesEnum subSpecies) = 0;
};

FishEnum

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' 

1 个答案:

答案 0 :(得分:1)

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没有。