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'

  • 2016년 01월 24일에 작성됨

조회수 287


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;한 것과 같은 효과를 내기 때문입니다.

  • 2016년 01월 24일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close