C++ 作为基类模板参数的内部枚举 布拉格语一次 #包括“stdafx.h” #包括“Token.h” //我希望此枚举位于类编号内 枚举数{0,1,2,3,4,5,6,7,8,9}; 类编号:public Token//此模板参数为Number::Number\u enm { 私人: 公众: 编号(常数编号和数量) 尝试: 令牌(num) { } 捕获(…) { cerr

C++ 作为基类模板参数的内部枚举 布拉格语一次 #包括“stdafx.h” #包括“Token.h” //我希望此枚举位于类编号内 枚举数{0,1,2,3,4,5,6,7,8,9}; 类编号:public Token//此模板参数为Number::Number\u enm { 私人: 公众: 编号(常数编号和数量) 尝试: 令牌(num) { } 捕获(…) { cerr,c++,enums,C++,Enums,不,您不能这样做,因为无法向前声明枚举。此外,这些构造函数try块是一个坏主意,但不相关 另请参阅Herb Sutter at的文章-他比我的谴责程度稍低。无论如何,正如我所说,try Block与您的问题无关。不,您不能,因为无法向前声明枚举。此外,但没有关系,那些Constructor try Block是个坏主意 另请参阅Herb Sutter at的文章-他比我的谴责性稍低。无论如何,正如我所说,试块与您的问题无关。我认为,如果您修复了错误,您可以 编辑:遗漏了注释,说您希望枚举位于类内

不,您不能这样做,因为无法向前声明枚举。此外,这些构造函数try块是一个坏主意,但不相关


另请参阅Herb Sutter at的文章-他比我的谴责程度稍低。无论如何,正如我所说,try Block与您的问题无关。

不,您不能,因为无法向前声明枚举。此外,但没有关系,那些Constructor try Block是个坏主意


另请参阅Herb Sutter at的文章-他比我的谴责性稍低。无论如何,正如我所说,试块与您的问题无关。

我认为,如果您修复了错误,您可以

编辑:遗漏了注释,说您希望枚举位于类内部:您不能这样做

1) 如果要调用基类的构造函数,则这是一个模板:

Number(const Number_enm& num)
    try:
    Token<Number_enm>(num)
编号(常数编号&num)
尝试:
令牌(num)
2) 您不能从构造函数级别的try块返回。您只能通过(重新)抛出退出-我假定不执行任何操作默认为重新抛出

不管怎么说,对于这样简单的类型,您希望出现什么样的异常


3) 在一个地方,您引用的是
my_data
,而不是
my_data
。但是,如果复制构造函数和赋值运算符具有默认行为,那么为什么要实现它们呢?(后者应返回
*this

在我看来,如果您修复了错误,您可以

编辑:遗漏了注释,说您希望枚举位于类内部:您不能这样做

1) 如果要调用基类的构造函数,则这是一个模板:

Number(const Number_enm& num)
    try:
    Token<Number_enm>(num)
编号(常数编号&num)
尝试:
令牌(num)
2) 您不能从构造函数级别的try块返回。您只能通过(重新)抛出退出-我假定不执行任何操作默认为重新抛出

不管怎么说,对于这样简单的类型,您希望出现什么样的异常


3) 在一个地方,您引用的是
my_data
,而不是
my_data
。但是,如果复制构造函数和赋值运算符具有默认行为,为什么要实现它们呢?(后者应返回
*this

有一种方法可以将枚举放入类中!…有点奇怪

我也想这样做,我提出的解决方案依赖于这样一个事实:枚举总是有一个底层类型(在我熟悉的所有编译器上,默认情况下都是int)。您必须在基类需要的所有位置指定“int”而不是枚举,但您可以将枚举传递到这些函数中!因此在您的情况下,您可以执行以下操作:

#pragma once
#include "stdafx.h"
#include "Token.h"

class Number : public Token<int> // 'int' instead of 'Number_enm'
{
private:

public:
    enum Number_enm {ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE};

    Number(const Number_enm& num)
    try:
    Token(num) // Passed in a Number_enm!
    {   }
    catch(...)
    {
        cerr << "Error in Number::Number(const Number_enm&).";
        return;
    }

    // I don't know what your Token class does, but I'm guessing that you
    // need to static_cast to int instead of Number_enm
    Number(const char num)
    try:
    Token(static_cast<Number_enm>(num & 0xf)) //get number value from char
    {
#ifdef DEBUG_
    cout << "Converting ctor, from char to Token.\n";
#endif
    }
    catch(...)
    {
        cerr << "Error in Number::Number(const char num).";
        return;
    }

};
#pragma一次
#包括“stdafx.h”
#包括“Token.h”
类别编号:公共令牌//“int”而不是“Number\u enm”
{
私人:
公众:
枚举数{0,1,2,3,4,5,6,7,8,9};
编号(常数编号和数量)
尝试:
令牌(num)//传入一个数字\u enm!
{   }
捕获(…)
{

cerr有一种方法可以将枚举放入类中!…有点

我也想这样做,我提出的解决方案依赖于这样一个事实:枚举总是有一个底层类型(在我熟悉的所有编译器上,默认情况下都是int)。您必须在基类需要的所有位置指定“int”而不是枚举,但您可以将枚举传递到这些函数中!因此在您的情况下,您可以执行以下操作:

#pragma once
#include "stdafx.h"
#include "Token.h"

class Number : public Token<int> // 'int' instead of 'Number_enm'
{
private:

public:
    enum Number_enm {ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE};

    Number(const Number_enm& num)
    try:
    Token(num) // Passed in a Number_enm!
    {   }
    catch(...)
    {
        cerr << "Error in Number::Number(const Number_enm&).";
        return;
    }

    // I don't know what your Token class does, but I'm guessing that you
    // need to static_cast to int instead of Number_enm
    Number(const char num)
    try:
    Token(static_cast<Number_enm>(num & 0xf)) //get number value from char
    {
#ifdef DEBUG_
    cout << "Converting ctor, from char to Token.\n";
#endif
    }
    catch(...)
    {
        cerr << "Error in Number::Number(const char num).";
        return;
    }

};
#pragma一次
#包括“stdafx.h”
#包括“Token.h”
类别编号:公共令牌//“int”而不是“Number\u enm”
{
私人:
公众:
枚举数{0,1,2,3,4,5,6,7,8,9};
编号(常数编号和数量)
尝试:
令牌(num)//传入一个数字\u enm!
{   }
捕获(…)
{

cerr好的,谢谢你的帮助。我在两本书和一篇文章中读到了关于ctor中try-catch块的内容(不记得是哪一本,但这是Scott Meyers写的文章)迈尔斯的第二本书。第二本书是一个很好的想法,你为什么说这是个坏主意?好吧,我读过所有的Meyers bookas和所有的斯特劳斯,除了最后一个,我从来没有读过任何一个这样的东西。构造函数的问题是它没有做任何有用的事情。C++,YO无论如何,你不应该使用try&catvch-mutch——相反,你应该使用RAII,这是迈尔斯和布斯在他们所有的书中都广泛讨论过的。我会接受你所说的。真的没有时间,翻阅这本书给你发几页,不,他们在其中解释了这种结构。好的,谢谢你的帮助。我读了关于try-catch-bl的内容在《克托尔》中,有两本书和一篇文章(不记得是哪一本,但这是斯科特·迈尔斯写的文章)迈尔斯的第二本书。第二本书是一个很好的想法,你为什么说这是个坏主意?好吧,我读过所有的Meyers bookas和所有的斯特劳斯,除了最后一个,我从来没有读过任何一个这样的东西。构造函数的问题是它没有做任何有用的事情。C++,YO无论如何,你不应该使用try&catvch-mutch——相反,你应该使用RAII,这是迈尔斯和布斯在他们所有的书中都广泛讨论过的。我会接受你所说的。真的没有时间,翻阅这本书给你发几页,不,他们在其中解释了这种结构。就像我在之前对尼尔的评论中所说的,我是v我读到这篇文章,我很高兴