내가 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&
을 가져야한다고 추측합니다.
그러나 블록이 const이어야한다고 생각하는 이유는 무엇입니까?
충분한 소스 코드를 제공하지 않은 경우 의견을 보내 주시면 그에 따라이 질문을 수정하겠습니다.
UPDATE 여기서 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));
}
}
'memorize_block'에 대한 정의를 제공 했습니까? 그렇다면 정의가있는 소스 파일을 컴파일하고 링크하고 있습니까? – Mahesh
ODR 위반과 같은 느낌입니다. 'memorize_block'의 또 다른 선언을 찾으십시오. 여기서 두 번째 매개 변수는 사실 const 참조입니다. –
@Igor : ODR? 'memorize_block'에 대한 다른 선언은 없습니다. 소스 트리를 통해 재귀 적으로 grepping하여 확인합니다. @Mahesh : memorize_block()의 소스는 정의되지 않은 ref와 같은 소스 파일에 있습니다. 또한 질문 1에 업데이트 1을 포함 시켰습니다. – Chap