gpt4 book ai didi

c++ - 在类模板上使用 arm gcc 编译期间出现段错误

转载 作者:行者123 更新时间:2023-11-30 03:22:42 25 4
gpt4 key购买 nike

我有一个实现中值过滤器的类模板。模板参数是数据类型和过滤器长度。

我在使用基于 gcc 4.8.3 的 arm-none-eabi-g++ 编译时出现段错误。使用 Clang 5.0.1 或 Gcc 7.3.0 编译代码时不会发出警告。

我正在为 C++11 编译。

是我的代码有问题,还是真正的 gcc 错误?如果有错误,是否有方便的解决方法?即使不是错误,我也会感谢任何改进建议。

我能想到的事情可能是原因(尽管我认为它们都应该是允许的):

  • 这个类内部声明了一个结构体,其中一个成员是指向结构体类型本身的指针
  • 这个类有两个静态constexpr成员数据元素

代码

声明

// In MedianFilter.h
template <typename dType, int len>
class MedianFilter
{

public:
dType read() { return xMed_; }
dType update(dType x);

private:
struct pair
{
pair* nextSmallest;
dType xi;
};

static constexpr dType stopper_ {0};
static constexpr int filterLen_ {len};

pair buffer_[filterLen_] = {};
pair* datpoint = buffer_;
pair small_ = {nullptr, stopper_};
pair big_ = {&small_, stopper_};

dType xMed_ {stopper_};

};

未显示定义(在 .h 文件中)

main.cpp

#include <cstdint>
using std::uint16_t;

#include "MedianFilter.h"

int main() {
MedianFilter<uint16_t, 7> filt;
filt.update(0);
return 0;
}

错误输出:

In file included from main.cpp:1:0: MedianFilter.h: In constructor
'constexpr MedianFilter<short unsigned int, 7>::MedianFilter()':
MedianFilter.h:22:7: internal compiler error: Segmentation fault
class MedianFilter

Please submit a full bug report, with preprocessed source if appropriate. See <http://gcc.gnu.org/bugs.html> for instructions.

最佳答案

在@einpoklum 的回答中描述,这是一个编译器错误,已在 gcc 4.9.1 中修复。解决方法相当简单——省略结构数组的大括号初始化并以其他方式实现您的设计意图。例如,您可以在结构的定义中提供默认成员初始值设定项。

在 C++11 中,类成员可以在类定义中初始化。编译器段错误是通过将此功能与结构数组一起使用而触发的,其中数组大小是从模板参数派生的:

pair buffer_[filterLen_] = {};

据我所知,从 C++11 开始,这个表达式应该使用一个空的初始化列表对类成员数组进行聚合初始化。这相当于用一个空列表 {} 初始化每个数组元素,它对各个结构执行聚合初始化(同样使用一个空的初始化列表)。

出于某种原因,此语法会导致编译器出现段错误。 4.9.1 之前的 gcc 解决方法只是为了避免这种语法。

关于c++ - 在类模板上使用 arm gcc 编译期间出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50936955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com