2012-03-20 1 views
4

부스트 직렬화 라이브러리를 실험 중이며 대부분 작동하고 있습니다. 유일한 문제는 별도의 .h 및 .cpp 파일이있는 개체를 serialize하려고 할 때입니다. 내가이 명령을 사용하여 컴파일 할 때 :별도의 .h 및 .cpp 파일을 사용하여 직렬화를 향상하십시오.

/tmp/cc8kbW6J.o: In function `void boost::serialization::access::serialize<boost::archive::text_oarchive, Class>(boost::archive::text_oarchive&, Class&, unsigned int)': 
boostSerialize.cpp:(.text._ZN5boost13serialization6access9serializeINS_7archive13text_oarchiveE5ClassEEvRT_RT0_j[void boost::serialization::access::serialize<boost::archive::text_oarchive, Class>(boost::archive::text_oarchive&, Class&, unsigned int)]+0x25): undefined reference to `void Class::serialize<boost::archive::text_oarchive>(boost::archive::text_oarchive&, unsigned int)' 

이 내 .H에서 무엇 :

g++ boostSerialize.cpp Class.cpp -lboost_serialization 

을 난이 오류가

#ifndef CLASS_H 
#define CLASS_H 
#include <iostream> 
#include <string> 
#include <boost/serialization/access.hpp> 

using namespace std; 

class Class{ 

    friend class boost::serialization::access; 
    int a,b,c; 
    string stringy; 
    template<class Archive> 
     void serialize(Archive &ar, const unsigned int); 
    public: 
     Class(int ab, int bb, int cb); 

}; 
#endif 

내 .CPP :

#include <iostream> 
#include "Class.h" 

using namespace std; 

Class::Class(int ab, int bb, int cb){ 
    a = ab; 
    b = bb; 
    c = cb; 
    stringy = "Text"; 
} 

template<class Archive> 
    void Class::serialize(Archive &ar, const unsigned int){ 
     ar & a & b & c & stringy; 
    } 

대신 모든 것을 넣으려고했습니다. .cpp에. 그리고 그것을 포함하고 그것은 잘 작동했다. 그래서 나는 그것이 .h 포함과 관련이 있다는 것을 안다. 어떤 이유로 그것은 serialize 함수를 찾지 못하고 있습니까? 나는 둘 다 대신 .cpp를 사용할 수있을 것 같지만 조직을 좋아하고 큰 프로젝트에 이것을 사용하고 싶습니다. 아이디어가 있으십니까? 미리 감사드립니다.

+0

http://www.parashift.com/c++-faq-lite/templates.html#faq-35.15 –

답변

8

Boost.Serialization과 같은 문제는 아니지만 함수 템플릿을 별도로 컴파일하려고합니다.

Class::serialize은 함수 템플리트입니다. 즉 전달 된 템플리트 매개 변수의 유형에 기초하여 인스턴스화됩니다. Class.cpp을 컴파일 할 때 컴파일러는 Class::serialize이 어떤 유형으로 인스턴스화 될지 모르기 때문에 코드를 생성 할 수 없습니다.

+0

그럼 어떻게 컴파일러에게 인스턴스화 될지 알려주시겠습니까? 아니면 내가 할 수 있습니까? – adamk33n3r

+0

@ adamk33n3r : 좋은 질문입니다! 'template void Class :: serialize (boost :: archive :: text_oarchive & ar, const unsigned int);'.cpp 파일에 명시 적으로 instansiate 할 수 있습니다. – Mankarse

+0

정말 고마워요! 당신은 뇌의 붕괴를 막아줍니다! 나는 이것을 잠시 동안 알아 내려고 애썼다. – adamk33n3r

관련 문제