【问题标题】:"C linkage function cannot return C++ class" in Visual Studio 2019Visual Studio 2019 中的“C 链接函数无法返回 C++ 类”
【发布时间】:2019-12-17 03:17:14
【问题描述】:

我有以下功能:

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

【问题讨论】:

  • 这都是关于Application Binary Inteface POD 类型的。如果您想使用 C 中的代码 - 您最好将 Foo *data; 替换为 void*struct Foo *;

标签: c++ visual-studio-2019 extern-c


【解决方案1】:

您可以通过将PyArray1D&lt;Foo&gt; 的显式模板特化添加到您的代码来进行编译:

template struct PyArray1D<Foo>;

我真的不知道为什么。我猜编译器在解析 extern 声明时看不到模板,如果它没有明确专门化的话

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 2020-07-16
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
相关资源
最近更新 更多