2011-01-22 2 views
38

클래스 중 하나의 메서드를 인라인 할 때 컴파일러 오류가 발생합니다. "인라인"키워드를 삭제하면 작동합니다.C++ 인라인 클래스 메서드가 정의되지 않은 참조를 발생시킵니다.

MAIN.CPP :

#include "my_class.h" 

int main() { 
    MyClass c; 
    c.TestMethod(); 

    return 0; 
} 

my_class.h :

class MyClass { 
public: 
    void TestMethod(); 
}; 

my_class.cpp :

여기

단순화 예제 내가 멀리 "인라인"를 가지고가는 경우에

main.cpp:(.text+0xd): undefined reference to `MyClass::TestMethod()' 

모든 것이 괜찮 : 나는 오류가

g++ main.cpp my_class.cpp 

:

#include "my_class.h" 

inline void MyClass::TestMethod() { 
} 

나는 컴파일하려고합니다. 이 문제의 원인은 무엇입니까? (클래스 메소드를 어떻게 인라인해야합니까? 가능합니까?)

고마워요.

답변

33

인라인 함수의 본문은 헤더에 있어야 컴파일러에서 필요에 따라 실제로 대체 할 수 있습니다. 이 참조 : How do you tell the compiler to make a member function inline?

+1

링크가 '이 서버에서 요청한 파일에 액세스 할 수있는 권한이 없습니다.'오류가있는 페이지로 연결됩니다. –

3

헤더 파일에는 인라인되지 않은 것으로 정의했지만 cpp 파일에서는 인라인으로 정의하려고합니다. 이는 충돌하는 정의이며 다른 정의에서 하나를 찾을 수 없습니다. 머리글은 실제로 인라인 키워드를 배치하는 곳입니다.

그러나 필자는 어쨌든 컴파일러에게 제안 사항이 더 많아서 인라인 키워드를 제거합니다. 헤더에 부동 함수가 있고 코드베이스에 여러 개의 정의가 나타나지 않게하려는 경우에만 필요합니다.

+0

'inline' 키워드가 가장 확실 단지 아니다 적어도 C++에서 힌트 - 그들은 컴파일러에게 정의를 약하게 만들고 필요할 경우에만 그것을 내 보낸다. 이것은 사용 된 곳에 있어야한다는 것을 의미하지만 다른 한편으로는 한 번 이상 포함될 수 있습니다. – bdonlan

+0

인라인을 어디에 두든 상관없이 오류가 계속 발생합니다 (또는 둘 다 인라인을 넣어도). 4 개의 조합 (인라인 my_class.h 및/또는 my_class.cpp) 중에서 인라인이없는 경우 만 작동합니다. – FrankMN

15

7.1.2/4 표준의 :

An inline function shall be defined in every translation unit in which it is used...

당신은 MAIN.CPP에 TestMethod를 사용하지만, 그것은 거기에 정의되지 않은 것.

... If a function with external linkage is declared inline in one translation unit, it shall be declared inline in all translation units in which it appears; no diagnostic is required.

당신은 정의 (따라서도 선언) TestMethod 인라인을 my_class.cpp에 있지만 MAIN.CPP한다.

이 경우 수정 중이 같은 헤더 파일에 함수 정의를 이동하는 것입니다 :

class MyClass { 
public: 
    void TestMethod() {} 
}; 

또는 같은

:

class MyClass { 
public: 
    inline void TestMethod(); 
}; 

inline void MyClass::TestMethod() {} 
관련 문제