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
调用不可用的默认构造函数,通常比在构造函数体中分配类成员更好。谢谢您的帮助。我按照您的建议做了,现在它正在正确编译。我已经搜索了两天。