김윤수의 이상계를 꿈꾸며  
대문으로
도라홈스쿨 | 태그 | 지역태그 | 미디어로그 | 방명록 | 관리자 | 새글 쓰기   
 
C++ 이야기 스물두번째: 0이 널포인터일까 ?
[공지1] 영문 블로그를 옮겼습니다. 주소는 http://codeguru.textcube.com 입니다. 새로운 내용을 올리진 않고, 당분간 이곳에 올린 내용들을 영어로 옮기는 작업을 할 것 같습니다. 제 영문 블로그도 많이 응원해 주세요~
[공지2] 최근 네이버에서 공개한 나눔고딕 글꼴을 적용했습니다. 나눔고딕이 없으신 분은 맑은 고딕, 윤디자인고딕, AppleGothic 순으로 적용됩니다. 나눔고딕이 없으신 분은 여기에서 다운 받으시면 됩니다
[공지3] 제 글을 복사하고 싶으신 분이나 저작권 정보를 알고 싶으신 분은 이 글을 읽어 보세요
[공지4] 각종 Open Source License 번역 시작
"0이 널포인터일까요 ?"

다음 코드를 한 번 보시겠어요 ? 컴파일이 잘 될까요 ?

#include <boost/shared_ptr.hpp>

class Nil {
};

int
main()
{
  Nil* np = 0;
  boost::shared_ptr<Nil> p1(np);
  boost::shared_ptr<Nil> p2(0);
}

0이 널포인터라면 당연히 정상적으로 컴파일 되어야겠지요. 그런데 컴파일 에러가 발생합니다.

$ g++ -Wall -o null null.cpp -I../boost_1_36_0
null.cpp: In function ‘int main()’:
null.cpp:11: error: no matching function for call to ‘boost::shared_ptr<Nil>::shared_ptr(int)
../boost_1_36_0/boost/shared_ptr.hpp:178: note: candidates are: boost::shared_ptr<T>::shared_ptr() [with T = Nil]
../boost_1_36_0/boost/shared_ptr.hpp:165: note:                 boost::shared_ptr<Nil>::shared_ptr(const boost::shared_ptr<Nil>&)

왜 그럴까요 ? shared_ptr 선언을 보면 분명 template<class Y> explicit shared_ptr(Y * p); 이런 생성자가 있기 때문에 boost::shared_ptr<Nil> p1(np); 라고 한 부분은 에러 없이 잘 넘어갔습니다. 그런데, 왜 boost::shared_ptr<Nil> p2(0); 는 컴파일되지 않는 걸까요 ? 0이 상황에 따라 임의의 포인터로 해석된다면 당연히 Y* 로도 해석될 수 있기 때문에 shared_ptr(Y*)가 매치되어야 맞을 것 같은데 말입니다. Nil* np = 0; 도 잘 넘어가지 않았습니까 ?

그런데도 위와 같은 에러가 발생하는 이유는 뭔가 0을 해석하는 규칙이 상황에 따라 달라지면서 발생하는 문제로 보입니다. 위 코드에서는 파랗게 표시한 부분처럼 0을 int 로 해석하고 있어서 컴파일이 안되고 있습니다. 이런 문제를 피하려면 강제 형변환을 하는 수밖에 없습니다. 즉, 다음과 같이 고치는 거죠.

#include <boost/shared_ptr.hpp>

class Nil {
};

int
main()
{
  Nil* np = 0;
  boost::shared_ptr<Nil> p1(np);
  boost::shared_ptr<Nil> p2((Nil*)0);
}

그럼 아무 문제없이 잘 컴파일됩니다. ^^

0이 다양하게 해석됨으로 인해 발생하는 문제와 이를 해결하기 위한 C++0x의 해결책은 어떤 것인지도 다음글을 통해 알아두시면 좋을 것입니다.

C++0x(차기 C++ 표준) 미리보기 1, 널 포인터의 이름은 nullptr

제 글이 유익하셨다면 오른쪽 버튼을 눌러 제 블로그를 구독하세요. ->
블로그를 구독하는 방법을 잘 모르시는 분은 2. RSS 활용을 클릭하세요.
RSS에 대해 잘 모르시는 분은 1. RSS란 무엇인가를 클릭하세요.


제 글이 유익하셨다면 오른쪽 버튼을 눌러 제 블로그를 구독하세요. ->
블로그를 구독하는 방법을 잘 모르시는 분은 2. RSS 활용을 클릭하세요.
RSS에 대해 잘 모르시는 분은 1. RSS란 무엇인가를 클릭하세요.

마지막으로 제 글이 유익하셨다면 과감하게 추천 버튼 한방 부탁드립니다 ^^

Tag : , , , ,


BLOG main image
이상계는 이쪽에 속해있지 않고 저쪽에 속해 있다. 이쪽에 사는 우리는 이쪽에 머무르지 않고 저쪽을 꿈꾸며 살아야 한다. 여기 오는 모든이들이 저쪽의 충만함을 이쪽에서의 매일의 삶에 경험할 수 있기를... E-mail: (yesarang) at (yahoo.co.kr)
 블로그 구독



meet me at meet me at me2DAY
E-mail 주소를 입력하세요:


 블로그 검색
Google
 Notice
me2day 개설했습니다.
블로그 스킨 바꾸었습니다
제 블로그의 성격
 분류
분류 전체보기 (341)
IT동향 (29)
사회동향 (4)
기술정리 (10)
개인 (17)
기타 (28)
기독교신앙 (1)
S/W개발 (110)
블로깅 (13)
리뷰 (8)
구글이야기 (9)
인터넷오늘은 (108)
독서 (3)
 태그 목록
인터넷오늘은 북마크 c++ 프로그래밍 sw개발 SW 개발 블로그 구글 SW 프로그래밍팁 c Programming Language S/W 개발 cpp 네이버 고수 고수팁 검색 고절가주팁 블로깅 IT 전략 iPhone 리뷰 다음 블로거 Programming Technology RSS
 달력
«   2009/07   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
 최근글
C++ 이야기 서른번째: boost::.. (4)
김윤수의 인터넷 오늘은 - 200..
김윤수의 인터넷 오늘은 - 200..
김윤수의 인터넷 오늘은 - 200.. (1)
C++이야기 스물아홉번째: Port..
 최근 댓글
그러게요. 저도 쓰면서 성능이..
김윤수 - 21:17
어느새 다녀갔네?
김윤수 - 21:15
아는대로 써 보는 거랑, 실제..
eslife - 07/01
좋은거 하나 배우고 갑니다. :)
파다기 - 07/01
전 미국에서 회사를 다녀서 그..
violino - 06/26
 최근 트랙백
TR1을 이용한 C++에서의 정규..
김재호의 디지털보단 아날로그
항목 39 : 가상 함수는 비공용..
최익필의 이름없는 블로그
죠커의 생각
jokka's me2DAY
검색 어뷰징 패턴 및 필터링..
made by 서보성
김윤수의 알림
yesarang's me2DAY
 Archive
2009/06
2009/01
2008/12
2008/11
2008/10
2008/09
2008/08
2008/07
2008/06
2008/05
2008/04
2008/03
 링크 모음
art.oriented
kkamagui 프로그래밍 세상
Monaca
Sutter's Mill
Yesarang's Blog[제 영문 블로..
[개인] Chester's Blog
[개인] Homo Scriptus
눈에 보이는 소프트웨어
류광의 번역 이야기
사진찍는 프로그래머
서광열의 프로그래밍 언어 이..
주네의 열린 소프트웨어
퓨처워커들의 u-Platform 이야기
필넷의 IT이야기
 방문자 통계
Total : 383,649
Today : 95
Yesterday : 29

믹시