C++ 这个函数签名是如何推断的?

C++ 这个函数签名是如何推断的?,c++,constants,undefined-reference,C++,Constants,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 memorize_b

我从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 memorize_block(MemoryBank&, Block&);
现在:下面是我如何解释错误消息的:链接器(或者实际上是编译器)以某种方式推断,memory_block()所需的签名必须具有parm1=
unordered_map&
,parm2=
block const&

但是为什么它认为块应该是常量

如果我没有提供足够的源代码,请评论,我会相应地修改这个问题

更新1 下面是用于记忆_块的代码,它与引用位于同一编译单元中。 任何地方都没有其他定义

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));
    }
}

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

是否提供了
记忆块的定义
?如果是,您是否正在编译和链接具有该定义的源文件?感觉像是ODR冲突。查找另一个
记忆块的声明,其中第二个参数实际上是常量引用。@Igor:ODR?没有其他
记忆块
的声明。通过递归地通过源树进行grepping验证@Mahesh:memory_block()的源代码与未定义的ref位于同一个源文件中。我还将其包含在问题“更新1”中。编译器显然不这么认为。尝试通过预处理器(对于gcc,
-E
选项)运行该源文件,检查输出以了解编译器看到的
记忆块的声明。client_ipc->get_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));
    }
}