Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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
Arm 将接口中的唯一指针用作类的属性时出错_Arm_Unique Ptr - Fatal编程技术网

Arm 将接口中的唯一指针用作类的属性时出错

Arm 将接口中的唯一指针用作类的属性时出错,arm,unique-ptr,Arm,Unique Ptr,简而言之,我需要正确使用unique_ptr的帮助,而不是库ArmNN。因此,下一段仅用于语境化 我正在调整我当前的应用程序以使用库。更具体地说,我是通过使用接口来实现的 在这个界面的第22行,我们有一个使用定义来定义一个接口的唯一的\u ptr,我认为这是我的问题的“原因” using ICaffeParserPtr = std::unique_ptr<ICaffeParser, void(*)(ICaffeParser* parser)>; 为了使用ArmNN库,我为MyCla

简而言之,我需要正确使用
unique_ptr
的帮助,而不是库
ArmNN
。因此,下一段仅用于语境化

我正在调整我当前的应用程序以使用库。更具体地说,我是通过使用接口来实现的

在这个界面的第22行,我们有一个
使用
定义来定义一个接口的
唯一的\u ptr
,我认为这是我的问题的“原因”

using ICaffeParserPtr = std::unique_ptr<ICaffeParser, void(*)(ICaffeParser* parser)>;
为了使用
ArmNN
库,我为
MyClass
创建了一个新的
private
属性:

namespace MYNAMESPACE {
    class MyClass {
        public:
            MyClass() {
            }
            // a lot of functions
            // a lot of attributes
        private:
            // a lot of functions
            // a lot of attributes
    }
}
armnnCaffeParser::ICaffeParserPtr myParser;
并在
MyClass()处实例化
myParser

MyClass::MyClass() {
    myParser = armnnCaffeParser::ICaffeParser::Create();
}
记住
icaffeparserpt
是一个
唯一的\u ptr
(我想),现在我有以下编译错误:

/my_path/src/detector.cpp: In constructor ‘MYNAMESPACE::MyClass::MyClass()’:
/my_path/src/detector.cpp:13:20: error: no matching function for call to ‘std::unique_ptr<armnnCaffeParser::ICaffeParser, void (*)(armnnCaffeParser::ICaffeParser*)>::unique_ptr()’
MyClass::MyClass() {
                 ^
In file included from /usr/aarch64-linux-gnu/include/c++/7/bits/locale_conv.h:41:0,
             from /usr/aarch64-linux-gnu/include/c++/7/locale:43,
             from /usr/aarch64-linux-gnu/include/c++/7/iomanip:43,
             from /usr/include/opencv2/flann/lsh_table.h:40,
             from /usr/include/opencv2/flann/lsh_index.h:49,
             from /usr/include/opencv2/flann/all_indices.h:42,
             from /usr/include/opencv2/flann/flann_base.hpp:43,
             from /usr/include/opencv2/flann.hpp:48,
             from /usr/include/opencv2/opencv.hpp:62,
             from /my_path/src/detector.hpp:11,
             from /my_path/src/detector.cpp:1:
/usr/aarch64-linux-gnu/include/c++/7/bits/unique_ptr.h:255:2: note: candidate: template<class _Up, class> std::unique_ptr<_Tp, _Dp>::unique_ptr(std::auto_ptr<_Up>&&)
unique_ptr(auto_ptr<_Up>&& __u) noexcept;

/usr/aarch64-linux-gnu/include/c++/7/bits/unique_ptr.h:255:2: note:   template argument deduction/substitution failed:
/my_path/src/detector.cpp:13:20: note:   candidate expects 1 argument, 0 provided
 MyClass::MyClass() {
                  ^
/my_path/src/detector.cpp:在构造函数“MYNAMESPACE::MyClass::MyClass()”中:
/my_path/src/detector.cpp:13:20:错误:调用'std::unique_ptr::unique_ptr()'时没有匹配的函数
MyClass::MyClass(){
^
在/usr/aarch64 linux gnu/include/c++/7/bits/locale_conv.h:41:0中包含的文件中,
来自/usr/aarch64 linux gnu/include/c++/7/locale:43,
来自/usr/aarch64 linux-gnu/include/c++/7/iomanip:43,
来自/usr/include/opencv2/flann/lsh_table.h:40,
from/usr/include/opencv2/flann/lsh_index.h:49,
from/usr/include/opencv2/flann/all_index.h:42,
来自/usr/include/opencv2/flann/flann_base.hpp:43,
从/usr/include/opencv2/flann.hpp:48,
从/usr/include/opencv2/opencv.hpp:62,
从/my_path/src/detector.hpp:11,
从/my_path/src/detector.cpp:1:
/usr/aarch64 linux gnu/include/c++/7/bits/unique\u ptr.h:255:2:注:候选:模板std::unique\u ptr::unique\u ptr(std::auto\u ptr&)
唯一(自动)无例外;
/usr/aarch64 linux gnu/include/c++/7/bits/unique\u ptr.h:255:2:注意:模板参数推断/替换失败:
/my_path/src/detector.cpp:13:20:注意:候选者需要1个参数,提供0
MyClass::MyClass(){
^

发生错误的原因是
myParser
实际上是默认初始化的,然后在
MyClass::MyClass()
的构造函数体上赋值

由于函数指针作为自定义删除器传递到
std::unique_ptr
以形成
ICaffeParserPtr
类型,因此
std::unique_ptr
的此特定实例的默认构造函数将根据禁用

换句话说,出于安全原因,
icaffeparserpt
,不能默认初始化-在初始化时指定哪个特定函数作为其删除程序

为了解决这个问题,您应该始终在成员初始值设定项列表中初始化类成员。在这种情况下,初始化
myParser

MyClass::MyClass():
  myParser(armnnCaffeParser::ICaffeParser::Create()) {}

这避免了为
std::unique\u ptr
调用不可用的默认构造函数,通常比在构造函数体中分配类成员更好。

谢谢您的帮助。我按照您的建议做了,现在它正在正确编译。我已经搜索了两天。