-2

以下代码未构建。

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是一个返回 type 的函数std::vector<std::string>;所有这些都在里面struct(我现在进一步更正了我的帖子以进一步澄清这一点)。也许我需要省略它与类型混淆的大小参数并在构造函数中的某处声明大小?我的意思是让这个向量成为结构的静态数据成员。如何让编译器理解这一点?

注意:在 Linux 上,我在一个类似于我最初拥有的代码(没有结构)的独立代码上对其进行了测试......所以也许它不会在 Linux 上通过这个更正进行编译。所以我删除了它在 Linux 上构建 OK 的评论。道歉。

4

3 回答 3

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() {}
于 2012-06-27T22:05:50.663 回答
0

您不能像那样在标头中初始化向量。由于它是静态的,因此您可以在源文件中声明它的位置:

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

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

于 2012-06-27T22:14:21.617 回答
0

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

这一切都取决于你vector从哪里得到的定义。如果您在某个地方包含了定义vector<>模板的标准 C++ #include 文件(或者,最近的std::vector<>模板),那么您将收到错误,因为它被定义为模板但未提供类型。它期望类似:

std::vector<int> v;

如果您一路上没有包含标准文件,它会从其他地方获取向量的定义,而 Lord 只知道它期望什么样的构造函数参数。

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

于 2012-06-27T21:10:52.950 回答