effective c++ item 25 source c++ template

책을 그냥 보고 지나치는 것이랑, 책에 있는 코드를 직접 쳐보는 것이랑은 천지차이다. 책에 있는 코드를 따라가다보면 무조건 에러와 만나게 된다. 그것을 해결하는데는 몇시간에서 몇주일이 걸리기도 한다. 하지만 그 이후엔 절대 잊지 않으리.

다른 항목을 공부하다 25항목에 관한 내용을 참조하게 되어 코드를 쳐봤다. 이런..에러가 좌르르르르. 두가지 큰 에러가 있었다. swap 클래스에 template<typename T> 선언을 안해 발생한 점. 그리고 이상하게 클래스 내부의 swap 에서 에러가 난다는 점.

#include "stdafx.h"
#include <memory>
#include <exception>
#include <algorithm>

namespace WidgetStuff {
class WidgetImpl {
public:
double da;
double db;
double dc;

};

template<typename T>
class Widget {
public :
Widget() {
this->pImpl = std::shared_ptr<T>(new T());
}

void swapCall(Widget& rhs) {
using namespace std;
swap(pImpl, rhs.pImpl);
}

Widget& operator=(const Widget& rhs) {
*pImpl = *(rhs.pImpl);
}

std::shared_ptr<T>& GetpImpl() {
return this->pImpl;
}

private:
std::shared_ptr<T> pImpl;
};

template<typename T>
void swap(Widget<T>& lhs, Widget<T>& rhs) {
lhs.swapCall(rhs);
}

};


int _tmain(int argc, _TCHAR* argv[])
{
{
using namespace WidgetStuff;

Widget<WidgetImpl> * widget1 = new Widget<WidgetImpl>();
widget1->GetpImpl().get()->da = 10.0;
widget1->GetpImpl().get()->db = 11.0;
widget1->GetpImpl().get()->dc = 12.0;

Widget<WidgetImpl> * widget2 = new Widget<WidgetImpl>();
widget2->GetpImpl().get()->da = 0.0;
widget2->GetpImpl().get()->db = 1.0;
widget2->GetpImpl().get()->dc = 2.0;
swap(*widget1, *widget2);

Widget<int> wd1;
int * p1 = wd1.GetpImpl().get();
*p1 = 10;

Widget<int> wd2;
int * p2 = wd2.GetpImpl().get();
*p2 = 5;

swap(wd1, wd2);

}
return 0;
}

빨간색 세부분이 에러가 났었다. namespace 문제인  것 같기도 하고..찾다가 임시적으로 저리 했는데..그냥 저렇게 해도 될것 같다. swap 에러 메시지는 다음과 같았다.

Error 1 error C2660: 'WidgetStuff::Widget<T>::swap' : function does not take 2 arguments c:\my projects\effectivetest\consoleapplication1\consoleapplication1.cpp 27

이와 관련된 에러는 다음 주소에 나와있다. http://msdn.microsoft.com/ko-kr/library/ek13fhc1(v=vs.80).aspx

어쨋든 이것을 수정하는 방법은 두가지이다. 위에서처럼 swap 의 중복된 함수명을 제거하든가, 원래의 에러메시지대로라면 
std::swap 을 호출하는게 맞는 것이다. 그런데 책에는 using namespace std; swap 을 호출하라고 하니 위처럼 한것이다.
책에 완벽한 소스가 없어서 혼란이 가중된다. 한번 더 정독해봐야겠다. 내 생각이 틀리다면 이 글도 다시 수정될 것이다.


덧글

  • 모피어스 2013/04/09 09:39 # 답글

    이름검색인 퀴니크 탐색 때문에 에러가 나는것인지...테스트 해봐도 뾰족한 결론을 못 내림
댓글 입력 영역