2011-04-29 3 views
0

안녕하세요 인라인 함수를 포함하는이, 난이 오류가 같은 : 예를 들어gtest 문제는 ​​

error LNK2019: unresolved external symbol "public: double __thiscall Math::returnPi(void)" ([email protected]@@QAENXZ) referenced in function "private: virtual void __thiscall Speed_Math_Test::TestBody(void)" ([email protected][email protected]@EAEXXZ) 

내 수업 (헤더 파일)

class Math 
{ 
public: 
    Math(void); 
    inline double returnPi(); 
    ~Math(void); 
}; 

내 수업 (CPP 파일)

Math::Math(void) 
{} 
Math::~Math(void) 
{} 
double Math::returnPi() 
{ return 3.14;} 

시험 :

TEST(EQ, Math) 
{ 
    Math *m=new Math(); 
    EXPECT_EQ(3.14,m->returnPi()); 
} 

내가해야 할 일은 무엇입니까? 나는 수동을 읽지 만 어떻게이 오류를 해결할 수 있는지 보지 못한다.

답변

3

인라인 함수는 소스 파일이 아닌 헤더 파일에 있어야하므로 호출자 (소스 파일에 액세스 할 수 없음)가 실제로 인라인 할 수 있습니다.

또한 함수 정의를 제공하면 클래스 선언에 inline을 지정할 필요가 없습니다.

class Math 
{ 
public: 
    Math(void); 
    double returnPi() { return 3.14; } // no need to specify inline here 
    ~Math(void); 
}; 

을 그리고 소스 파일에서 returnPi()에 대한 정의를 제거합니다

그래서 헤더가 될 것이다. 당신은 또한 할 수 있었다

참고 :

class Math 
{ 
public: 
    Math(void); 
    double returnPi(); 
    ~Math(void); 
}; 


inline double Math::returnPi() { return 3.14; } // inline is mandatory here to avoid respecting the "One Definition Rule" 

당신은 함수 정의에서 별도의 클래스 선언을 유지하려는 경우 두 번째 솔루션은 좋다.

또한 inline은 실제 함수 호출이 인라인된다는 것을 보장하지 않습니다. 단 하나의 규칙은 "하나의 정의 규칙"을 준수 할 필요가 없다는 것입니다. inline 함수는 다음과 같은 동일한 정의를 가져야합니다. 모든 번역 단위.

+0

예 두 번째 솔루션 도움말, 인라인 함수가있는 경우 헤더 파일에 그녀를 인식해야합니다. –

0

프로젝트의 일부로 클래스 'CPP 파일을 컴파일 하시겠습니까? 괜찮을거야.

+0

예 저는 정상적으로 컴파일하는 단어 인라인 클래스를 삭제하고 테스트가 통과되면 shure입니다. –