2014-03-06 3 views
0

이 클래스 :정적 인라인 메소드는 정적 멤버 초기화를 필요로하지

KH

class k 
{ 
    static int ii; 
    static void foo(); 
}; 

k.cpp

#include "k.h" 

void k::foo() 
{ 
    ii++; 
} 

컴파일하는 동안 나는 다음과 같은 오류 메시지가 나타납니다 :

error LNK2001: unresolved external symbol "private: static int k::ii" ([email protected]@@0HA) 

괜찮습니다. 내가 방법 inline 키워드를 추가 할 때, 오류가 사라된다

class k 
{ 
    static int ii; 
    inline static void foo(); 
}; 

이 실제 예제 아니지만, 정확히이 코드에서 일어나는 모르는 누군가가 나에게 그것을 설명 할 수있다?

+0

'foo'는 어디에 사용됩니까? 'ii'는 어디에 정의되어 있습니까? 'foo'는 어디에 정의되어 있습니까? –

+0

@Charles Bailey foo 아무데도 사용하지 않고, 아무데도 정의되지 않았으며, foo가 cpp 파일에 정의되어 있습니다. 그러나 나는 이미 아래 답변에 대한 설명을 얻었습니다. foo는 사용되지 않으므로 코드가 생성되지 않습니다. – begezavr

답변

2

이 코드 : 함수 K : 푸 컴파일러에 의해 출력하고,이 K를 참조하므로

#include <iostream> 
using namespace std; 

struct k 
{ 
    static int ii; 
    static void foo(); 
}; 

void k::foo() { 
    ii=0; 
} 

int main() { 
    // your code goes here 
    return 0; 
} 

는 링킹 오류 준다 : II.

이 코드 :

#include <iostream> 
using namespace std; 

struct k 
{ 
    static int ii; 
    inline static void foo(); 
}; 

inline void k::foo() { 
    ii=0; 
} 

int main() { 
    // your code goes here 
    return 0; 
} 

는 함수 K :: foo는 인라인 선언하고 어디에서 호출되지 않으므로 컴파일러는 실제로 그것을 위해 어떤 코드를 생성하지 않기 때문에하는 연결 오류를 제공하지 않습니다.

main 또는 다른 곳에서 k :: foo()에 대한 호출을 추가하면 연결 오류가 발생합니다.

+0

C++에서는 사용하는 것에 비용을 지불합니다. – rmi

+0

감사합니다. 논리적으로 들립니다. – begezavr