这个函数签名是如何推断出来的?

时间:2013-09-05 00:34:27

标签: c++ const undefined-reference

我从g ++获得的编译器错误是

./Debug_gcc_lin64_5610_ST/tom.o: In function `process_P2T_CUST(IPC*)':
/mxhome/charrison/git/libs/tom.cpp:512: undefined reference to `memorize_block(boost::unordered_map< ... >&, Block const&)'

(省略号)。

包含未定义引用的源代码片段是:

void
process_P2T_CUST(IPC *client_ipc) {

    // Get list of record types in block                                                                                                 
    Block& block = client_ipc->get_block();
    block.get_record_types(input_record_set);

    // Reset associative memory                                                                                                          
    memory.clear();

    // Add all field=value pairs from P2T_CUST into memory                                                                           
    memorize_block(memory, block);

memorize_block的标题定义是:

void memorize_block(MemoryBank&, Block&);

现在:这是我如何解释错误消息 - 链接器(或实际编译器)以某种方式推断memorize_block()所需的签名必须具有parm1 = unordered_map&,并且parm2 = Block const&

但是为什么它认为Block应该 const

如果我没有提供足够的源代码,请发表评论,我会相应修改此问题。

更新1 这是memorize_block的代码,它与引用位于同一个编译单元中。 在任何地方都没有其他定义。

void
memorize_block(MemoryBank& memory, Block &block) {
    D_RecordType_Vector record_types;
    block.get_record_types(record_types);    
    BOOST_FOREACH(const D_RecordType_Set::value_type& rec_type, record_types) {
            block.traverse_record(rec_type, add_to_memory(memory));
    }
}

1 个答案:

答案 0 :(得分:0)

问题不在于编译器,如果你到达那一行错误,编译就完成了。不要担心签名的常量。这里的问题是你的链接器无法找到函数的“定义”,他只知道“声明”,这意味着你只有函数的点子,而不是实现。如果实现是在未提供给编译器的cpp中,那么您需要添加它