C++ 在Windows上(而不是Linux上)编译错误C2131和C3863

C++ 在Windows上(而不是Linux上)编译错误C2131和C3863,c++,cmake,C++,Cmake,我有一段代码可以在Linux(Raspbian)上编译并运行良好,但不能在windows(VS17)上编译 我使用CMAKE 3进行跨平台编译,正如我所说的,在Linux上构建它没有问题 以下是我正在使用的唯一CMAKE选项: cmake_minimum_required(VERSION 3.1) project(Track) set (CMAKE_CXX_STANDARD 11) ... // The rest of the CMakeLists.txt has nothing fancy

我有一段代码可以在Linux(Raspbian)上编译并运行良好,但不能在windows(VS17)上编译

我使用CMAKE 3进行跨平台编译,正如我所说的,在Linux上构建它没有问题

以下是我正在使用的唯一CMAKE选项:

cmake_minimum_required(VERSION 3.1)
project(Track)
set (CMAKE_CXX_STANDARD 11)
...
// The rest of the CMakeLists.txt has nothing fancy
但是在windows下(使用VS17本机编译器),有一段代码甚至没有生成,我不明白为什么。我得到的错误是(对不起,这是法语,但我认为可以理解):

错误C2131:l'expression n'a pasétévaluée en constante
注:本表为非施工项目最终完工的原因
注:voir l‘标准利用率::向量::大小’
错误C3863:le type de TABLEU'float['FONUCTION'+]['FONUCTION'+]'n'est pas attributable
以及导致错误的(简化)代码段:

// Defined somewhere else
class ROI
{
}

class Tracker
{
public:
    void UpdateTrack(vector<ROI> new_roi)
    {
        // some code
        float match_table[new_roi.size() + 1][m_tracked_roi.size() + 1];  // COMPILE ERROR
        // some code
    }

private:
    vector<ROI> m_tracked_roi;
}
//在其他地方定义
类ROI
{
}
类跟踪器
{
公众:
void UpdateTrack(矢量新_roi)
{
//一些代码
浮点匹配_表[new_roi.size()+1][m_roi.size()+1];//编译错误
//一些代码
}
私人:
向量m_跟踪的m_roi;
}
P>我认为问题是数组的大小只有在编译时或类似的情况下才知道,但现在C++是可能的,它在Linux上工作得很好(通过工作,我的意思是它构建并运行良好)。 有人能解释一下发生了什么事吗?如何在windows上修复此问题?(可能还有一些其他的CMake选项?)


预先感谢

< P>可变长度数组不是标准C++的一部分。数组边界必须是编译时常量表达式


GCC和Clang都提供VLA作为扩展,但VisualStudio没有。如果您需要跨平台非等长数组,请使用
std::vector

谢谢您的回答。这意味着GCC和Clang是比VS更聪明的编译器?这不是有点丢脸吗?我知道STD::vector(我一直使用它们),但是用STD::Vector来声明2D数组是一种痛苦。不,这意味着它们实现了不是C++语言的一部分。使用STD::CODLAD:<代码> STD::数组< /COD>绑定必须是一个编译时常数,就像原始数组一样,编译时大小数组是可能的。其<代码>大小<代码>方法是“代码> CONTXPRP</代码>,因此它是声明另一个数组时使用的有效编译时常量表达式(即<代码> STD::数组< /COD>或原始数组)。C和C++是不同的语言。VLAS是C的一部分,但它们不是C++的一部分。
// Defined somewhere else
class ROI
{
}

class Tracker
{
public:
    void UpdateTrack(vector<ROI> new_roi)
    {
        // some code
        float match_table[new_roi.size() + 1][m_tracked_roi.size() + 1];  // COMPILE ERROR
        // some code
    }

private:
    vector<ROI> m_tracked_roi;
}