我在声明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)
}
答案 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 [])。您的代码将正常运行。