[C++] template 함수에서 함수 인자에 const 사용법은?
글쓴이: kwchun / 작성시간: 월, 2005/10/17 - 1:10오후
STL의 remove_copy 함수를 다음과 같이 구현해 보았는데요.
template<class In, class Out, class Tp> Out remove_copy(In b, In e, Out d, const Tp& t) { while (b != e) { if (*b != t) *d++ = *b; ++b; } return d; }
다음과 같이 콜하니까,
list<int> a, d; remove_copy(a.begin(), a.end(), back_inserter(d), 1);
함수형식이 다르다고 에러가 납니다. 그런데, 함수 선언부에서 네번째 인자의 const를 빼면 에러가 안나고요. 논리적으로 const를 써야할 것 같은데, 뭐가 잘못된건지 모르겠네요. STL의 동명 함수를 확인해봐도 거의 같은 구조인데요.
Forums:
Re: template 함수에서 함수 인자에 const 사용법은?
혹시
이런 것을 쓰지 않으셨나요? 그러면 표준에 정의된 std::remove_copy()와
::remove_copy() 중 어느 것을 호출할지 모호하므로 나는 에러입니다.
이런 식으로 하면 됩니다.
overloading resolution 과정에서 const 참조형 인자와 non-const 참조형 인자는
다른 형으로 간주하기 때문에 모호한 호출이 아니고 따라서 에러가 아닙니다.
우선 결론부터 말하자면, 지적하신 부분이 맞았습니다. 함수 이름을 my
우선 결론부터 말하자면, 지적하신 부분이 맞았습니다. 함수 이름을 my_remove_copy라고 바꾸니까 컴파일 에러가 없어졌습니다. 하지만, 다른 의문점이 생기네요. 저는 algorithm 헤더를 인클루드하지도 않았고, std 네임스페이스를 다 등록하지도 않았습니다. 코드 앞부분은 다음과 같습니다.
그렇다면, 위의 해더 중 하나에서 stl_algo.h를 인클루드하고, 네임스페이스를 등록한다는 말인가요?
[quote="kwchun"]그렇다면, 위의 해더 중 하나에서 stl_a
그런 것 같습니다. gcc 3.4.2의 경우 iostream -> ostream -> ios -> bits/ios_base.h
-> bits/locale_classes.h -> string -> algorithm 의 경로로 #include 되더군요.
노파심에서 말씀드리지만 모든 구현체가 항상 이런 경로로 #include 되는 것은
아니며, 심지어 <algorithm>이 #include 되지 않을 수도 있습니다. 즉 원래 코드는
구현체에 따라 성공적으로 컴파일이 될 수도 있고 아닐 수도 있습니다.
그렇지는 않습니다. stl_algo.h가 #include 되었다면 ADL(argument-dependent
lookup)에 의하여 std::remove_copy()도 오버로딩의 후보가 됩니다.
::remove_copy()와 std::remove_copy()는 서로 다른 namespace에 있으므로
중복 정의된 것이 아니고, remove_copy(a.begin(), a.end(), back_inserter(d), 1)의
후보로서 둘 중 어느 것도 우위에 있지 않으므로 모호한 호출이 되는 것입니다.
댓글 달기