Fra*_*ank 7 c++ extern-c visual-studio-2019
我有以下功能:
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}
}
Run Code Online (Sandbox Code Playgroud)
但是,这不会使用 VS2019 编译(但是它使用 gcc 编译)并带有警告
C 链接函数不能返回 C++ 类
然而,当模板参数是双精度时它确实有效......我可以返回一个'PyArray1D',而VS不会抱怨。
所以我添加了一个新的结构:
struct FooArray {
std::size_t size;
Foo *data;
};
Run Code Online (Sandbox Code Playgroud)
并从 extern C 函数返回它。
extern "C" FooArray SimulatePhotonEvents()
{
Foo * foo = new Foo();
return {1, foo}
}
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,这奏效了!我的问题是,为什么?
VS 不够聪明,可以看到 FooArray get 是从模板函数中创建的吗?还有其他更简单的方法来解决这个问题吗?
您可以通过为PyArray1D<Foo>代码添加显式模板特化来进行编译:
template struct PyArray1D<Foo>;
Run Code Online (Sandbox Code Playgroud)
我其实不知道为什么。我猜编译器在解析 extern 声明时无法看到模板,如果它没有显式专门化
| 归档时间: |
|
| 查看次数: |
275 次 |
| 最近记录: |