static클래스 멤버에서 Undefined reference

발생하는 문제 및 실행환경

제 코드에서 왜 컴파일 에러가 뜨는걸까요? 그리고 코드1은 안되면서 MEMBER를 int로 형 변환하면 잘되는 이유는 뭔가요? (g++ 4.2.4에서 컴파일)

소스 코드

#include <vector>

class Foo {  
public:  
    static const int MEMBER = 1;  
};

int main(){  
    vector<int> v;  
    v.push_back( Foo::MEMBER );       // 1. 안됨 - undefined reference to 'Foo::MEMBER'
    v.push_back( (int) Foo::MEMBER ); // 2. 잘됨 
    return 0;
}

에러 내용

undefined reference to 'Foo::MEMBER'

1답변

  • 좋아요

    0

    싫어요
    채택취소하기

    컴파일 에러가 뜨는 이유

    class 정의 뒤에 static 멤버를 정의해야 합니다. 아래의 코드처럼 하면 에러가 없어질 거예요

    class Foo { /* ... */ };
    
    const int Foo::MEMBER;
    
    int main() { /* ... */ }
    

    이렇게 해줘야 하는 이유는 static 멤버 변수의 수명이 프로그램 시작이 아닌, 해당 변수가 호출된 시점부터 시작하기 때문입니다.

    예를 들면

    class Foo {
    public:
        Foo(){
            cout << "Foo!!!!!" << endl;
        }
    };
    
    class Bar {
    public:
        static const Foo foo;
    };
    
    //주석처리
    //const Foo Bar:: foo;
    
    int main(){
        return 0;
    }
    

    이 코드는 Bar에 static const Foo foo가 있음에도, 아무것도 출력되지 않고 프로그램이 종료됩니다. 하지만 Bar클래스와 main사이에 const Foo Bar:: foo;의 주석처리를 제거하면 foo!!!!!가 출력되고 프로그램이 종료됩니다.

    (int) Foo::MEMBER 에서는 에러가 뜨지 않는 이유

    (int)로 형 변환을 하면 중간에 Bar타입의 임시 객체가 생성되어 앞의 const Foo Bar:: foo;한 것과 같은 효과를 내기 때문입니다.

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.