gpt4 book ai didi

c++ - 在 MSVC C++ DLL 中导出模板化类的模板化成员函数

转载 作者:行者123 更新时间:2023-11-28 05:00:42 27 4
gpt4 key购买 nike

我正在将 PCL 库 ( https://github.com/PointCloudLibrary/pcl.git ) 编译成 DLL,以便在我自己的项目中使用。这是一个大量使用 C++ 模板的项目。为了减少编译时间,我使用 PCL_NO_PRECOMPILE 设置为 OFF,这意味着实现不在头文件中。我的应用程序只能使用在编译 PCL 时实例化的类和函数。

问题是模板化类的模板化成员函数没有在 MSVC DLL 中导出。我正在使用 MS Visual Studio 2017 社区版。这是具体问题。

我正在创建 pcl::Hough3DGrouping 的子类,它在 https://github.com/PointCloudLibrary/pcl/blob/master/recognition/include/pcl/recognition/cg/hough_3d.h 处定义。 .感兴趣的特定函数是在文件底部第 510 行定义的 protected 函数 computeRf()。当我查看 DLL 中导出的符号时,我没有看到 computeRf( )。因此我无法从我的自定义代码中使用它。

我假设 computeRf() 没有在 DLL 中导出,因为它是模板化的。因此,我在 https://github.com/PointCloudLibrary/pcl/blob/master/recognition/src/cg/hough_3d.cpp 中尝试了显式实例化.具体我加了

template void pcl::Hough3DGrouping<pcl::PointXYZRGB, pcl::PointXYZRGB, pcl::ReferenceFrame, pcl::ReferenceFrame>::computeRf<pcl::PointXYZRGB, pcl::ReferenceFrame>(const boost::shared_ptr<const pcl::PointCloud<pcl::PointXYZRGB> >, pcl::PointCloud<pcl::ReferenceFrame>)

https://github.com/PointCloudLibrary/pcl/blob/master/recognition/src/cg/hough_3d.cpp 的第 44 行.

编译时出现错误:

E:\libs\pcl\src\recognition\src\cg\hough_3d.cpp(45): error C3190: 'void pcl::Hough3DGrouping<pcl::PointXYZRGB,pcl::PointXYZRGB,pcl::ReferenceFrame,pcl::ReferenceFrame>::computeRf(const boost::shared_ptr<const pcl::PointCloud<PointT>>,pcl::PointCloud<PointModelRfT>)' with the provided template arguments is not the explicit instantiation of any member function of 'pcl::Hough3DGrouping<pcl::PointXYZRGB,pcl::PointXYZRGB,pcl::ReferenceFrame,pcl::ReferenceFrame>'
with
[
PointT=pcl::PointXYZRGB,
PointModelRfT=pcl::ReferenceFrame
]

我的目标是在我的应用程序中创建 pcl::Hough3DGrouping 的子类,并从中调用基类的方法 computeRf()。我需要的唯一实例是:

pcl::Hough3DGrouping<pcl::PointXYZRGB, pcl::PointXYZRGB, pcl::ReferenceFrame, pcl::ReferenceFrame>
pcl::Hough3DGrouping<pcl::PointXYZRGB, pcl::PointXYZRGB, pcl::ReferenceFrame, pcl::ReferenceFrame>::computeRf<pcl::PointXYZRGB, pcl::ReferenceFrame>

我应该如何在对 PCL 源代码进行最少更改的情况下做到这一点?

最佳答案

显然不能从 DLL 中导出模板。

复制粘贴您尝试导出的内容和签名:

template<typename PointType, typename PointRfType> void
computeRf
(const boost::shared_ptr<const pcl::PointCloud<PointType> > &input, pcl::PointCloud<PointRfType> &rf)

template void
pcl::Hough3DGrouping<pcl::PointXYZRGB, pcl::PointXYZRGB, pcl::ReferenceFrame, pcl::ReferenceFrame>::
computeRf<pcl::PointXYZRGB, pcl::ReferenceFrame>
(const boost::shared_ptr<const pcl::PointCloud<pcl::PointXYZRGB> >, pcl::PointCloud<pcl::ReferenceFrame>)

我注意到了不同。您试图导出其函数参数不是引用的内容。模板类的模板方法有引用函数参数。

编译器说“这些不匹配”。我会相信的。

将参数设为引用,它将匹配类中的方法。

template void
pcl::Hough3DGrouping<pcl::PointXYZRGB, pcl::PointXYZRGB, pcl::ReferenceFrame, pcl::ReferenceFrame>::
computeRf<pcl::PointXYZRGB, pcl::ReferenceFrame>
(const boost::shared_ptr<const pcl::PointCloud<pcl::PointXYZRGB> >&, pcl::PointCloud<pcl::ReferenceFrame>&)

关于c++ - 在 MSVC C++ DLL 中导出模板化类的模板化成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46126308/

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