1

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

我有很多麻烦:如果我将它声明为static然后我在实现(cpp 文件)中初始化它可以工作,但是如果我想创建一个从第二个文件中的第一个继承的新类,它会抱怨

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

如果我在标题中标明它,我会遇到双重声明的问题。

什么是正确的方法?我必须使用外部吗?如何?

我有:

文件_A.h:

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

文件_A.cpp:

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

文件_B.h

class B : public A

文件_B.cpp

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

2 回答 2

1

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

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

此外,sizeof只能对完整类型进行操作。这不是一个完整的类型:

int a[];

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

于 2012-11-01T13:40:20.350 回答
0

你的错误是你试图 sizeof of 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[]). 您的代码将正常工作。

于 2012-11-01T13:24:27.877 回答