由枚举初始化的向量

时间:2012-06-27 21:00:01

标签: c++ vector enums

以下代码无法构建。

struct some_struct {
    some_struct() {
      ... do something here to specify size of v; how ??
    }
    enum {
       ZERO,
       ONE,
       TWO
    };

    static std::vector<std::string> v(TWO);
};

欣赏任何想法......似乎没有任何迹象表明这是非法使用。

错字:修正了矢量语法和修正:我只在2005/2008而不是2010年进行了测试。对于那些问过的人的错误信息:

error C2061: syntax error : identifier 'TWO'

进一步编辑:

看起来编译器认为v是一个返回类型std::vector<std::string>的函数;所有这些都在struct内(我现在已经进一步纠正了我的帖子,以便更多地澄清这一点)。也许我需要省略它与类型混淆的size参数并在构造函数中的某处声明大小?我的意思是这个向量是结构的静态数据成员。如何让编译器理解这一点?

注意:在Linux上,我在一个独立的代码上测试它,它类似于我最初的代码(没有结构)...所以也许它不会在Linux上用这种修正编译。所以我删除了它在Linux上构建好的评论。道歉。

3 个答案:

答案 0 :(得分:2)

您无法在类声明中初始化类成员。你需要在外面实例化它:

#include <vector>
#include <string>

struct some_struct {
    some_struct() {
    }
    enum {
       ZERO,
       ONE,
       TWO
    };

    static std::vector<std::string> v;
};

std::vector<std::string>
some_struct::v = std::vector<std::string>(TWO);

int main() {}

答案 1 :(得分:0)

注意:OP对原始问题的更正无效以下所有内容。

这完全取决于你从哪里得到vector的定义。如果某个地方你已经包含了一个定义vector<>模板的标准C ++ #include文件(或者最近的std::vector<>模板),那么你会得到错误,因为它被定义为模板但是没有提供类型。它期望像:

std::vector<int> v;

如果你还没有在某个地方包含标准文件,它就会从其他地方获得vector的定义,而且Lord只知道它期望的构造函数参数类型。

无论如何,作为一个类的向量是非标准的,如果声明和实现从一个环境到另一个环境不同(或不存在),这就不足为奇了。

答案 2 :(得分:0)

您不能像这样初始化标题中的向量。因为它是静态的,所以你可以在源文件中声明它:

std::vector<std::string> some_struct::v(TWO);

如果它不是静态的,你可以在类构造函数的初始化列表中进行。