Visual Studio 2019 中的"C linkage function cannot return C++ class"

"C linkage function cannot return C++ class" in Visual Studio 2019

本文关键字:cannot return C++ class function Studio 2019 中的 Visual linkage      更新时间:2023-10-16

我有以下函数:

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是从模板函数中创建的吗?还有其他不那么黑客的方法可以解决这个问题吗?

您可以通过向代码添加用于PyArray1D<Foo>的显式模板专用化来进行此编译:

template struct PyArray1D<Foo>;

我其实不知道为什么。我猜编译器在解析 extern 声明时看不到模板,如果它没有明确专用