c++ - Visual Studio 2019 中的“C 链接函数无法返回 C++ 类”
问题描述
我有以下功能:
class Foo;
template <typename T>
struct PyArray1D{
std::size_t size;
T *array;
};
extern "C" PyArray1D<Foo> SimulatePhotonEvents()
{
Foo * foo = new Foo();
return {1, foo}
}
但是,这不会使用 VS2019 编译(但是它使用 gcc)并带有警告
C 链接函数不能返回 C++ 类
但是,例如,当模板参数为双精度时,它确实有效……我可以返回一个“PyArray1D”,而 VS 不会抱怨。
所以我添加了一个新结构:
struct FooArray {
std::size_t size;
Foo *data;
};
并从外部 C 函数返回它。
extern "C" FooArray SimulatePhotonEvents()
{
Foo * foo = new Foo();
return {1, foo}
}
令我惊讶的是,这奏效了!我的问题是,为什么?
VS 还不够聪明,无法看到 FooArray get 是从模板函数中创建的吗?还有其他更简单的方法来解决这个问题吗?
解决方案
您可以通过为代码添加显式模板特化来PyArray1D<Foo>
进行编译:
template struct PyArray1D<Foo>;
我其实不知道为什么。我猜编译器无法看到模板,如果它没有明确专门化,同时解析 extern 声明
推荐阅读
- haskell - 如何克服 [cabal: error while loading shared libraries:] Arch Linux 上的错误?
- reactjs - 如何使用 useQuery 钩子在其他钩子中填充状态?
- swift - 将 UIKit 与 Vapor 或 Kitura 一起使用
- sql - 尝试加入子查询时出现语法错误
- java - 处理避免 NullPointerException 的链式方法调用 - 哪种方法最好?
- javascript - dart 中的简洁属性
- uefi - 如何从 startup.nsh 退出 UEFI-Shell
- c# - 如何在不更改表单背后的代码的情况下每秒动态更新表单内的子控件?
- javascript - 如何将按钮 innerHTML 设置为图像?(使用 DOM)
- html - Angular 7手动将背景颜色设置为平铺