Visual Studio 2019 中的"C linkage function cannot return C++ class"
"C linkage function cannot return C++ class" in 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}
}
但是,这不会使用 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 声明时看不到模板,如果它没有明确专用
化相关文章:
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- C++函数中的精确"return"矩
- 赛通"Cannot take address of memoryview slice"
- '[](std::list& list)<int>{return std::move(list)}(list)' 是否保证将 'list' 留空?
- C++:如何将 unix 时间的字符串转换为 *tm?(使用时间错误:"cannot convert 'String' to 'tm*' ")
- /usr/bin/ld: cannot find -lc++
- 方法错误"not all control paths return a value"和方法不返回值
- GLFW glfwCreateWindowSurface return -7
- "Missing type specifier - int assumed"无法通过向主函数添加"return 0"来解决
- Cannot find -lglad
- "Cannot find -l<directory>"错误 - CMake
- 如何解决类成员函数中的"return a value"错误?
- C++概念assignable_from不接受 const&-return 运算符=
- Windows cannot find MinGW
- 我一直收到错误"cannot convert 'float*' to 'float' in return"
- Visual Studio 2019 中的"C linkage function cannot return C++ class"
- 犰狳/ Xcode:无处"functions that differ only in their return type cannot be overloaded"错误
- "Cannot overload functions distinguished by return type alone"是什么意思?
- "Cannot overload functions by return type alone"错误
- 使失败并显示错误"cannot convert ‘std::istream {aka std::basic_istream<char>}’ to ‘bool’ in return"