Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 虚拟析构函数Arduino由于未定义对运算符delete的引用_C++ - Fatal编程技术网

C++ 虚拟析构函数Arduino由于未定义对运算符delete的引用

C++ 虚拟析构函数Arduino由于未定义对运算符delete的引用,c++,C++,当接口包含纯虚拟方法时,建议使用虚拟析构函数。例如,我有以下代码: template class A { protected: char buffer[Size]; public: virtual void method() = 0; A() = default; virtual ~A() = default; }; template class B : public A {

当接口包含纯虚拟方法时,建议使用虚拟析构函数。例如,我有以下代码:

template class A { protected: char buffer[Size]; public: virtual void method() = 0; A() = default; virtual ~A() = default; }; template class B : public A { public: void method() override; B() = default ~B() = default; }; int main() { B b; b.method(); } 模板 甲级{ 受保护的: 字符缓冲区[大小]; 公众: 虚空方法()=0; A()=默认值; virtual~A()=默认值; }; 模板 B类:公共A{ 公众: void方法()重写; B()=默认值 ~B()=默认值; }; int main(){ B B; b、 方法(); } 但是,当我尝试使用g++为Arduino Due编译此文件时,我得到以下错误:

main.cpp:(.text._ZN4r2d29robot_arm22uarm_gcode_generator_cILj100EED0Ev[_ZN4r2d29robot_arm22uarm_gcode_generator_cILj100EED5Ev]+0x6): undefined reference to `operator delete(void*, unsigned int)' main.cpp:(.text._ZN4r2d29robot_arm22uarm_gcode_generator_cILj100EED0Ev[_ZN4r2d29robot_arm22uarm_gcode_generator_cILj100EED5Ev]+0x6):未定义对“运算符删除(void*,unsigned int)”的引用
然而,当我将析构函数从一个完整的数据库中删除时,它会删除错误,但这不会导致未加载的行为吗?另外,当我刚刚从的析构函数中删除virtual关键字时,它会给我相同的错误消息。

很奇怪,析构函数的唯一存在会引入对全局
操作符delete
的引用。但是,您似乎不是第一个遇到此问题的人:。正如在评论中指出的,C++标准库在代码> > AVR G+++ 中,这也是最有可能使用的。 尽管如此,我相信我可以提供一些安慰

当接口包含纯虚拟方法时,建议使用虚拟析构函数

只有在需要通过基本指针
删除对象时,才需要使用虚拟析构函数。将虚拟析构函数视为接口本身的一部分。如果接口声明了虚拟析构函数,则意味着“可以删除实现此接口的对象”。操作
delete
成为界面的一部分


如果您不需要将
删除功能作为界面的一部分,我认为这实际上应该是默认功能,那么您就不需要虚拟析构函数。只需将析构函数声明为非虚拟并对其进行保护。这样,您就可以从接口中删除操作<代码>删除>代码,并传递决定是否可以进一步删除一个类型的接口,具体的实现是:

是否链接到C++标准库的实现?请注意,如果我只是将您的代码复制并粘贴到Arduino Web编辑器中(在修复打字错误后),它在那里编译得很好…