如何声明一个静态向量成员

时间:2012-11-01 12:51:03

标签: c++ static extern

我在声明std::vector<std::string>类型的静态成员时遇到了一些问题,原则上我可以用数组std::string[]替换它。

我遇到了很多麻烦:如果我将其声明为static然后我在实现(cpp文件)中初始化它可以工作但是如果我想创建一个新的类继承自第一个提出抱怨的文件

error: invalid application of ‘sizeof’ to incomplete type ‘std::string []’

如果我在标题中对它进行了decalre,那么双重声明会出现问题。

什么是正确的方法?我必须使用extern吗?怎么样?

我已经:

file_A.h:

class A { public: static string s[]; }

file_A.cpp:

string A::s[] = { ... };

file_B.h

class B : public A

file_B.cpp

void B::function()
{
for (string* s = A::s; s != A::s + sizeof(A::s) / sizeof(string); ++s)
}

2 个答案:

答案 0 :(得分:1)

你误解了sizeof运营商在做什么。它为您提供数据类型的大小,而不是实际数据的大小。有时,数据类型的大小恰好与实际数据的大小相同。仅当数据类型本身定义了可以容纳多少数据时才会出现这种情况:

int a[50]; // 50 ints: sizeof(a) == 50 * sizeof(int)

此外,sizeof只能在完整类型上运行。这不是一个完整的类型:

int a[];

不完整类型是缺少确定其大小所需信息的类型。您永远无法使用sizeof来获取a的大小。

答案 1 :(得分:0)

你的错误在于你正在尝试string s[]的大小。编译器不知道你的字符串数组的大小。

例如:

void B::function()
{
for (string* s = A::s; s != A::s + sizeof(A::s) / sizeof(string); ++s)
}

在你的函数中使用sizeof()。您可以使用for (int i = 0; !A::s[i].empty(); ++i)来获取字符串数组的大小。

PS。如果你不使用sizeof(string [])。您的代码将正常运行。