Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;枚举转换和模板_C++_Templates_Enums - Fatal编程技术网

C++ C++;枚举转换和模板

C++ C++;枚举转换和模板,c++,templates,enums,C++,Templates,Enums,VS2008出现以下错误:转换为枚举类型需要显式转换(静态转换、C样式转换或函数样式转换) 将ClassA向下转换为ClassA_1时,ClassA_1是接收参数枚举的模板化类,例如: 这是对我的问题的编辑,重复使用了下面的答案,但修改后导致了我的问题,我们开始: 好的,我已经能够用以下代码重现我的错误: class ClassA { public: virtual ~ClassA(){} }; template <class Param1 = void*> class C

VS2008出现以下错误:转换为枚举类型需要显式转换(静态转换、C样式转换或函数样式转换)

将ClassA向下转换为ClassA_1时,ClassA_1是接收参数枚举的模板化类,例如:

这是对我的问题的编辑,重复使用了下面的答案,但修改后导致了我的问题,我们开始:

好的,我已经能够用以下代码重现我的错误:

class ClassA
{
public:
    virtual ~ClassA(){}
};

template <class Param1 = void*> class ClassB : public ClassA {
public:
    //constructor
    ClassB(Param1 p1 = NULL)
    {
        _p1 = p1;
    }
    //ClassB(const ClassB<Param1>& ref);
    Param1 _p1;
    ~ClassB(){}
};

enum lolcakes {
    cakeisalie,
};


ClassA* ptr = new ClassB<lolcakes>(lolcakes::cakeisalie);

ClassB<lolcakes>* a1 = (ClassB<lolcakes>*)ptr;
A类
{
公众:
虚拟~ClassA(){}
};
模板类ClassB:公共类A{
公众:
//建造师
类B(参数1 p1=NULL)
{
_p1=p1;
}
//B类(常数B类和参考);
参数1 p1;
~ClassB(){}
};
枚举棒棒糖蛋糕{
卡凯萨利,
};
ClassA*ptr=新的ClassB(lolcakes::cakeisalie);
ClassB*a1=(ClassB*)ptr;

这里有太多语法错误,我不知道从哪里开始。下次,请张贴您使用的实际代码

首先,我假设你想写这个:

ClassA<myenum>* a = new ClassA_1<myenum>();
这很有效

编辑问题后更新

这一行中有一个重要错误:

ClassB(Param1 p1 = NULL)
您不能使用<代码> null <代码>作为默认参数,因为您的<代码> PARAM1类型不是指针——这是一个枚举(严格地说,这应该是工作的,因为在C++中,代码>空NU/COD>被定义为等于<代码> 0代码/代码>,但它仍然是一个逻辑错误)。与其使参数可选,更好的替代方法是重载构造函数。或者,以下方法也适用:

ClassB(Param1 p1 = Param1())
这将使用类型
Param1
的默认值

代码中还有一个错误:

ClassA* ptr = new ClassB<lolcakes>(lolcakes::cakeisalie);
ClassA*ptr=newclassb(lolcakes::cakeisalie);
枚举常量在C++中的工作方式不同:它们不创建自己的名称空间,因此无法限定它们的用法。请忽略枚举的名称:

ClassA* ptr = new ClassB<lolcakes>(cakeisalie);
ClassA*ptr=新的ClassB(cakeisalie);
最后,请永远不要使用C样式转换。始终使用适当的C++样式转换替换它们。在您的情况下,替换

ClassB<lolcakes>* a1 = (ClassB<lolcakes>*)ptr;
ClassB*a1=(ClassB*)ptr;

ClassB*a1=boost::多态下行(ptr);
//或
B类*a1=静态铸件(ptr);
A类
{
虚拟~ClassA(){}
};
模板类ClassB:公共类A{
公众:
//建造师
B类(参数1 p1)
:p1(p1){}
B类(常数B类和参考);
参数1 p1;
~ClassB(){}
};
枚举棒棒糖蛋糕{
卡凯萨利,
};
ClassA*ptr=新的ClassB(lolcakes::cakeisalie);
ClassB a=(ClassB(lolcakes::cakeisalie));
B类a1=a;

请尝试在您的问题中发布语法正确的代码。如果没有ClassA_1的任何实例化,这些代码甚至无法在VC10中编译。我得到的唯一错误是lolcakes::cakeisalie的非标准扩展警告。解决了这个问题,代码在VS2010上可以很好地编译。我有各种道德上的反对意见,但它确实可以编译。那段代码在VS2010上也可以编译,而且应该可以。这样的指针向上转换是错误的,但不是未定义或非法的。如果编译器不接受错误,则需要发布错误文本。我刚刚尝试使用VS2010,我得到了2个错误:错误1错误C2440:“默认参数”:无法从“int”转换为“lolcakes”;错误4错误C2548:“ClassB::ClassB”:使用dynamic_cast或至少boost::polymorphic_downcast的参数1Consider缺少默认参数。@Noah:(我放弃了上一条评论。)你说得对,
boost::多态性_downcast
会更好。但是
dynamic\u cast
不会,因为我们知道
a
的类型
dynamic_-cast
表示“我不知道对象的类型”,而
static_-cast
表示“我假设一种类型,如果该假设是错误的,则这是一个错误”
dynamic_cast
只有在我们不确定应该使用哪种类型,并且随后检查是否为null时才应该使用。我发布了新代码(在问题中),该代码会受到此问题的影响。@Konrad-我在看到这些类型转换时不会使用这些假设,我也不会建议这样做。我想你可以把你关于静态演员的假设改写成,“此转换必须尽可能快,如果错误,我愿意允许未定义的行为影响我的客户。我希望它不会发生,我已经充分确保它不会发生,但我知道如果它真的发生了可怕的事情,随机的事情可能会发生在用户身上,我已经让自己无法恢复。“不是说它没有它的用途,而是使用static_cast来downcast真的应该总是以这种态度来对待。@Noah:操作符有这些含义。一个
dynamic\u cast
肯定在这里描述了错误的语义。我发布了新的代码(在问题中),这些代码会受到这个问题的影响。
ClassB<lolcakes>* a1 = (ClassB<lolcakes>*)ptr;
ClassB<lolcakes>* a1 = boost::polymorphic_downcast<ClassB<lolcakes>*>(ptr);
// or
ClassB<lolcakes>* a1 = static_cast<ClassB<lolcakes>*>(ptr);
class ClassA
{
    virtual ~ClassA(){}
};

template <class Param1> class ClassB : public ClassA {
public:
    //constructor
    ClassB(Param1 p1)
        : _p1(p1) {}
    ClassB(const ClassB<Param1>& ref);
    Param1 _p1;
    ~ClassB(){}
};

enum lolcakes {
    cakeisalie,
};

ClassA* ptr = new ClassB<lolcakes>(lolcakes::cakeisalie);
ClassB<lolcakes> a = (ClassB<lolcakes>(lolcakes::cakeisalie));
ClassB<lolcakes> a1 = a;