我知道最终我需要将trigram(其中一个空格包含前一个字符串中的3个字符)更改为动态数组以解决此问题,但我尝试先将数组的容量设置得足够大。但是,当我编译代码时,会出现错误。
webView.loadUrl(url);
webView.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView view, String url) {
webView.setVisibility(View.VISIBLE);
super.onPageFinished(view, url);
}
});
代码:
#error: variable length array of non-POD element type 'string' (aka 'basic_string<char>'#
}
答案 0 :(得分:1)
变量expect(actual.parent).toBeDefined("or more precisely, expected object " + actual + " to have a parent");
不是编译时常量变量,而变量长度数组不在C ++中(尽管有些将它作为扩展名,但显然并非适用于所有类型)。
您的问题有两种解决方案:
将变量转换为编译时常量,方法是将CAPACITY
替换为constexpr
(对于较旧的编译器),或者将其定义为预处理器宏。
使用std::vector
,例如const
我的建议是你使用上面的两个解决方案,至少如果你以后需要调整矢量大小。如果大小将在编译时修复并且永远不会更改,那么使用第一个解决方案和使用std::array
而不是C风格的数组:
std::vector<std::string> trigram(CAPACITY);
答案 1 :(得分:1)
变量
int CAPACITY = 1000;
应该是一个常数
const int CAPACITY = 1000; // or with c++11 constexpr int CAPACITY = 1000;
代表
string trigrams[CAPACITY];
因为“ISO C ++禁止变量长度数组'三元组'”(g ++ message)
这个
for (int i = 0; i < CAPACITY; i++)
trigrams[i] = 0;//initialize each element to 0
应该是
for (int i = 0; i < CAPACITY; ++i)
trigrams[i] = "";//initialize each element to 0
您没有“将[strings]初始化为0”,但使用零长度 C字符串。零长度C字符串不是无效的0指针,而是指向值为0的char的(有效)指针;
一般来说,如果有STL方法可以避免使用C数组,最好不要使用C数组;对于c ++ 11,如果你想保持“足够大的容量”方法,那么std::array<std::string, CAPACITY>
会更好。
live在Coliru的
我冒昧地将i++
- ++i
中的所有for
改为std::vector<std::string> trigrams;
。见例如。 What is the difference between ++i and i++了解其背后的理由。
对于动态(没有预定义的边界)数组,请使用for (std::size_t i = 0; i < trigrams.size(); ++i) {/* ... */}
,
push_back或emplace_back你的字符串进入该向量, 并为i-迭代
std::vector
或者使用std::for_each(trigrams.begin(), trigrams.end(),
some_function_or_functor_that_does_the_job);
的迭代器接口,例如
for (auto& s : trigrams) {/* ... */}
(参见std :: foreach here),
或c ++ 11只是
yield
除非您需要像在第二个循环中那样自定义迭代。
答案 2 :(得分:0)
C ++数组的大小必须是常量表达式。您将其声明为int CAPACITY = 1000;
,这不是常量表达式。添加const
限定符可解决此问题:int const CAPACITY = 1000;
。
但是,您应该避免使用普通数组。如果您在编译时知道大小,请尝试使用std::array
,否则尝试使用std::vector
。