错误:非POD元素类型的可变长度数组&#39; string&#39; (又名&#39; basic_string <char>&#39;)

时间:2015-11-17 14:28:09

标签: c++ arrays string compiler-errors dynamic-arrays

我知道最终我需要将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>'#

}

3 个答案:

答案 0 :(得分:1)

变量expect(actual.parent).toBeDefined("or more precisely, expected object " + actual + " to have a parent"); 不是编译时常量变量,而变量长度数组不在C ++中(尽管有些将它作为扩展名,但显然并非适用于所有类型)。

您的问题有两种解决方案:

  1. 将变量转换为编译时常量,方法是将CAPACITY替换为constexpr(对于较旧的编译器),或者将其定义为预处理器宏。

  2. 使用std::vector,例如const

  3. 我的建议是你使用上面的两个解决方案,至少如果你以后需要调整矢量大小。如果大小将在编译时修复并且永远不会更改,那么使用第一个解决方案使用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_backemplace_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