static클래스 멤버에서 Undefined reference
조회수 5645회
발생하는 문제 및 실행환경
제 코드에서 왜 컴파일 에러가 뜨는걸까요?
그리고 코드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 답변
-
컴파일 에러가 뜨는 이유
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;
한 것과 같은 효과를 내기 때문입니다.
댓글 입력