【问题标题】:C++ static struct init - item does not name a typeC ++静态结构初始化 - 项目没有命名类型
【发布时间】:2015-01-08 08:25:39
【问题描述】:

我正在尝试将我的解决方案放在一个静态类中,该类的定义如下:

class myDataParser{
    private:

    public:
    struct myData{
        struct index {
            static int item1,item2,item3,item4;
        };
        static char delimiter;
    };

};

但是当我尝试像这样在主程序中初始化项目时:

myDataParser::myData::delimiter = ';';
myDataParser::myData::index::item1 = 0;
myDataParser::myData::index::item2 = 1;
myDataParser::myData::index::item3 = 2;
myDataParser::myData::index::item4 = 3;

我得到错误:

'item1' in 'struct myDataParser::myData::index' does not name a type

...分隔符和 item2-4 也是如此,我做错了什么?如何正确设置这些成员?

【问题讨论】:

    标签: c++ struct static initialization


    【解决方案1】:

    来自标准 (N3690): 9.4.2. §2

    static 数据成员在其类定义中的声明不是 定义,并且可能是除 cv 限定之外的不完整类型 空白。 static 数据成员的定义应出现在 包含成员的类定义的命名空间范围。在里面 命名空间范围内的定义,静态数据成员的名称 应使用 :: 运算符由其类名限定。这 静态数据成员定义中的初始化表达式在 其类别的范围 (3.3.7)。 [ 例子

    class process {
        static process* run_chain;
        static process* running;
    };
    process* process::running = get_main();
    process* process::run_chain = running;
    

    类进程的静态数据成员run_chain在全局中定义 范围;符号 process ::run_chain 指定成员 run_chain 是类进程的成员,在类的范围内 过程。在静态数据成员定义中,初始化器 表达式是指类进程运行的静态数据成员。 — 结束示例 ] [ 注意:一旦定义了静态数据成员, 即使没有创建其类的对象,它也存在。 [ 示例:在上面的示例中,run_chain 和 running 存在,即使没有 类进程的对象由程序创建。 — 结束示例 ] — 结束说明 ]

    【讨论】:

    • 好吧,这个例子展示了该做什么,但乍一看它是一个不清楚的例子(因为它混合了同一类的范围和成员),而且它并没有真正说明为什么会这样。
    【解决方案2】:

    为定义静态成员的数据类型添加前缀charint等:-

    char myDataParser::myData::delimiter = ';';
    ~~~
    int myDataParser::myData::index::item1 = 0;
    ~~~
    
    //....
    

    【讨论】:

    • 它的工作原理:)!但为什么 ? :D 为什么我需要陈述已经陈述过的东西?
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多