은 업데이트 2하지 않을 때 때의 C +로, 비주얼 스튜디오 2010 재고 컴파일러를 사용하여 컴파일 된 이해결되지 않은 외부 방법은 CPP 파일에 정의되어 있지만 헤더에
업데이트의 원인이 전방 선언 버그 발견 + 0x가 사용 설정되었습니다.
이상하게 행동하는 멤버 함수가있는 클래스가 있습니다.
cpp 파일에서 메서드를 정의 할 때 링커가 "확인되지 않은 외부 기호"오류로 넘어집니다. 정의를 헤더로 옮기면 잘 컴파일됩니다.
1) 내가
어떤 생각을 난처한 상황에 빠진거야)에 CPP 파일이 확실히) (3) 컴파일되고있는 템플릿 방법 이 아닌가요?
헤더 파일
// THIS IS THE ERROR HERE: I forward declare TPA as a class, when it is actually a struct
class TollingPathAttributes; // forward declare the TollingPathAttributes struct as a class (doh!)
class TollingPathAttributesOutput
{
public:
TollingPathAttributesOutput(HighwayCommand* command);
~TollingPathAttributesOutput();
void foo();
void AddPathAttributes(boost::shared_ptr<TollingPathAttributes> attributes);
protected:
string m_outputFilename;
vector<shared_ptr<TollingPathAttributes>> m_data;
queuing_mutex m_dataMutex;
};
CPP 파일
void TollingPathAttributesOutput::foo() {}
void TollingPathAttributesOutput::AddPathAttributes(boost::shared_ptr<TollingPathAttributes> attributes)
{
queuing_mutex::scoped_lock lock(m_dataMutex);
m_data.push_back(attributes);
}
호출 전화
m_output->foo(); // compiles and links no problem
boost::shared_ptr<TollingPathAttributes> attr =
boost::make_shared<TollingPathAttributes>(origin, dest, UNTOLLED_OPTION, vector<int>(), 0.0, 0.0);
m_output->AddPathAttributes(attr); // compiles fine, but only links correctly if I move the definition to the header
링크 오류
1>OtCustomZenith_logic.lib(TollingPathAttributesRecorder.obj) : error LNK2019: unresolved external symbol "public: void __thiscall TollingPathAttributesOutput::AddPathAttributes(class boost::shared_ptr<class TollingPathAttributes>)" ([email protected]@@[email protected]@@@[email protected]@@Z) referenced in function "public: virtual void __thiscall TollingPathAttributesRecorder::Record(class TolledPath &,class boost::shared_ptr<class Path>,int)" ([email protected]@@[email protected]@[email protected]@@@[email protected]@[email protected])
1>..\..\..\OT\OtCustomZenith_test.exe : fatal error LNK1120: 1 unresolved externals
어떻게 컴파일하나요? –
내 일반 개발자는 아니므로, 기계 그래서 내가 테스트 할 수 없으며 이것은 단지 오타 일지 모르지만 m_data는 shared_ptr (네임 스페이스로 부스트하지 않음)의 벡터입니다. 다른 참조는 네임 스페이스를 갖고있는 반면 문제가 될 수 있습니까? – tmpearce
@tmpearce 명백한 boost :: shared_ptr은 메소드의 호출 사이트/헤더/cpp 정의 사이의 불일치를 배제하는 것이 었습니다.일반적으로 나는 어딘가에 boost :: shared_ptr을 사용한다. 나는 shared_ptr이 boost 네임 스페이스에서 나온다고 확신한다. –