C++ namespace 안에 함수 선언하면 링크시 외부기호 못찾는 오류?

purplerain1의 이미지

안녕하세요 c만 하다가 덜컥 c++프로젝트를 맡게된 초보입니다.

다름이 아니라 헤더파일에서 네임스페이스 안에 함수를 선언했는데 프로젝트 빌드단계에서 LNK2019 에러가 나네요.

//homealone.cpp 메인함수

#include "stdafx.h"
#include"bond_info.h"

void call_bond();

int _tmain(int argc, _TCHAR* argv[])

{
call_bond();
return 0;
}

//call_bond.cpp 실제 getbond함수가 구현된 파일

#include"bond_info.h"

void call_bond(){

BondLib::bond bnd= BondLib::getbond();

}

BondLib::bond getbond(){
BondLib::bond rst= BondLib::bond(1,1);
return rst;
}

//bond_info.h getbond함수가 선언된 헤더파일

namespace BondLib{
struct bond{
bond(int _a, int _b):a(_a),b(_b){}
int a;
int b;
};
bond getbond(); //네임스페이스 안의 구조체를 결과로 내보내는 함수입니다.
}

오류 메세지는 error LNK2019: "struct BondLib::bond __cdecl BondLib::getbond(void)" (?getbond@BondLib@@YA?AUbond@1@XZ) 외부 기호(참조 위치: "void __cdecl call_bond(void)" (?call_bond@@YAXXZ) 함수)에서 확인하지 못했습니다. call_bond.obj homealone

이렇게 나네요;;

그런데 헤더파일에서 함수를 네임스페이스 밖에 선언하면 또 빌드가 잘 됩니다 ㅠㅠ
아래와 같이 바꾸면용..
namespace BondLib{
struct bond{
bond(int _a, int _b):a(_a),b(_b){}
int a;
int b;
};
}
BondLib::bond getbond();

뭐가 문제인지 가르쳐 주시면 정말 감사드려요.

kukyakya의 이미지

선언은 네임스페이스 안에다 하시고, 정의를 네임스페이스 바깥에서 하셨네요.

cpp를 다음과 같이 작성하시면 잘 될 것 같습니다.

namespace BondLib {
  bond getbond(){
    return bond(1,1);
  }
}