以下代码无法构建。
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上构建好的评论。道歉。
答案 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);
如果它不是静态的,你可以在类构造函数的初始化列表中进行。