7

我有以下功能:

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 是从模板函数中创建的吗?还有其他更简单的方法来解决这个问题吗?

4

1 回答 1

5

您可以通过为代码添加显式模板特化来PyArray1D<Foo>进行编译:

template struct PyArray1D<Foo>;

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

于 2019-08-09T11:50:59.270 回答