cppyy中类型别名作为函数参数的调用失败问题
问题分析与解决方案
问题根源
你的代码存在两个关键问题:
- TestClass构造函数仅声明未实现:C++代码中只定义了构造函数的签名,没有编写函数体,cppyy无法找到可执行的函数逻辑,这是调用失败的直接原因。
- std::initializer_list的传递方式错误:
std::initializer_list是C++的特殊临时类型,手动构造TestDictClass对象无法被cppyy正确映射到构造函数期望的参数类型。
修复步骤
1. 补全构造函数实现
修改C++代码部分,为TestClass的构造函数添加具体实现:
using namespace std; enum class TestEnum { Foo, Bar }; using TestDictClass = initializer_list<pair<TestEnum, int>>; class TestClass { public: TestClass(TestDictClass x) { // 示例实现:遍历并打印参数内容 for (const auto& item : x) { printf("枚举值: %d, 整数: %d\n", static_cast<int>(item.first), item.second); } } };
2. 正确传递initializer_list参数
cppyy支持直接将Python列表转换为C++的std::initializer_list,无需手动构造TestDictClass对象。修改Python调用代码:
import cppyy cppyy.cppdef( """ using namespace std; enum class TestEnum { Foo, Bar }; using TestDictClass = initializer_list<pair<TestEnum, int>>; class TestClass { public: TestClass(TestDictClass x) { for (const auto& item : x) { printf("枚举值: %d, 整数: %d\n", static_cast<int>(item.first), item.second); } } }; """ ) from cppyy.gbl.std import pair from cppyy.gbl import TestEnum, TestClass TestPair = pair[TestEnum, int] # 直接传入Python列表,cppyy自动完成类型转换 res = TestClass([TestPair(TestEnum.Bar, 4), TestPair(TestEnum.Foo, 12)]) print(res)
关于类型别名的说明
TestDictClass这个类型别名本身没有问题,cppyy可以正常识别using定义的类型别名。之前的错误和类型别名无关,主要是构造函数未实现加上参数传递方式不符合cppyy的转换规则。
内容的提问来源于stack exchange,提问作者Christiaan Swanepoel
相关产品推荐
相关产品推荐

