如何将 Corba 结构(包含“任何”类型)复制到 C++ 结构中

Posted

技术标签:

【中文标题】如何将 Corba 结构(包含“任何”类型)复制到 C++ 结构中【英文标题】:How to copy a Corba struct (containing an "any" type) into a C++ struct 【发布时间】:2020-11-05 18:02:06 【问题描述】:

在 Corba 中,我有一个这样的结构:

module XYZ 
    typedef string AttributeName;  
    struct AttributeColumn 
        AttributeName name;              // Column attribute name
        any    data;                     // Column attribute value
    ;
    typedef sequence <AttributeColumn> AttributeTable;

它包含来自相应 Sqlite 数据库表的值,该表具有以下字段:

ABC_Name VARCHAR NOT NULL UNIQUE

我想将这些值复制到 C++ 结构中,该结构由以下内容组成:

namespace DEF 
    typedef std::string AttributeName;
    typedef std::vector<std::string> StringCol;
    struct AttributeColumn 
        AttributeName name;              // Column attribute name
        StringCol str;                   // Column values if string
    ;
   typedef std::vector<AttributeColumn> AttributeTable;

这是我的尝试:

XYZ::AttributeTable & xyz_table = getAttributeTable (); // This gives me the table containing the data from the database.
int rows = getLength ( xyz_table ); // This gives me the number of rows in the database.
DEF::AttributeTable def_table;

for (int i=0;i<rows;i++) 
    def_table[i].name = xyz_table[i].name;
    std::cout << def_table[i].name << std::endl;
    xyz_table[i].data >>= def_table[i].str;
    std::cout << def_table[i].str << std::endl;

但是,以上内容无法编译。 我收到以下错误消息:

ERROR: 1> error: no match for ‘operator>>=’ (operand types are ‘CORBA::Any’ and ‘DEF::StringCol’ aka ‘std::vector<std::basic_string<char> >’)

如果我注释掉 for 循环中的最后两行,则代码会编译,但会崩溃。 因此,不知何故,将“名称”字段复制到 def_table 中也无法正常工作。

【问题讨论】:

您使用的是哪种 CORBA 实现?你试过TAOX11吗? 嗨,我对 CORBA 实现一无所知。我可以访问的唯一 CORBA 元素是 .idl 文件,我无法对其进行修改。我怎样才能发现该文件使用了什么实现? 您使用哪个 IDL 编译器来编译 IDL 文件,该 IDL 编译器与您的 CORBA 实现有关。 您还必须链接一些由您的 CORBA 实现提供的 CORBA 库。也许remedy.nl/opensource/corbapg.html 的 CORBA 程序员指南是一个好的开始 【参考方案1】:

试试这个:

namespace DEF 
typedef std::string AttributeName;
typedef std::vector<std::string> StringCol;
struct AttributeColumn 
    AttributeName name;              // Column attribute name
    CORBA::Any str;                   // Column values if string
;
typedef std::vector<AttributeColumn> AttributeTable;
;

因为str需要是同一类型的数据。

【讨论】:

以上是关于如何将 Corba 结构(包含“任何”类型)复制到 C++ 结构中的主要内容,如果未能解决你的问题,请参考以下文章

不同语言之间的 Corba 通信

如何在颤动中将图像复制到剪贴板

CORBA 测试自动化

CORBA:如何将 QT 对象作为参数传递

CORBA::String_var -> 我不能为这种类型的类字段分配任何值

如何将一种泛型类型的结构复制到 TypeScript 中的另一种泛型?