모두의 코드 커뮤니티

샌세 함수 template 특수화 질문 있습니다

9.2 강의 내용中 [임의의 문자열 을 합치는 예제]에서 '두번째 시도 ’ 코드에서 궁금한점이 있습니다.
강의 에서는 GetStringSize 함수(=일반 함수)를 오버로딩 하는 방식으로 해주셨는데, template을 배우고 있어서 template 으로 할 수 있나 해보았습니다. 아래는 그 코드입니다.

#include <iostream>
#include <string>

using namespace std;

template <typename T>
size_t GetStringSize(const T& s) { return s.size(); }

template<>
size_t GetStringSize<const char*>(const char* s) { return s.strlen(); }


template<typename T,typename... types>
size_t GetStringSize(const T& arg, types... args) {
	return GetStringSize(arg) + GetStringSize(args...);
}

int main() {
	
	int n = GetStringSize("faf");
	cout << n << endl;	
	return 0;
}

헌데
template<> size_t GetStringSize<const char*>(const char* s) { return s.strlen(); }
요기 함수 특수화 부분에서 컴파일 오류가 뿜뿜 하고 있습니다.

질문 전에 구글링도 해보고 여러 글도 보고 왔는데 얻을 수 있는 답변은 1. 함수 템플릿은 부분 특수화는 불가능하다 라는 것과, 2. 그래서 오버로딩으로 해결 가능하다라는 것입니다.

그런데 지금 위에 오류가 생기는 코드는 부분 특수화가 아니라 완전특수화를 한것인데도 오류가 생기는게 잘 모르겠습니다…

2번째, 오버로딩을 해결 가능하다는것도
template<typename T> size_t GetStringSize(const char* s) { return s.strlen(); } 으로 오버로딩 해서 실행해도
int n = GetStringSize(“faf”); <-- 이 부분이 오버로딩한 함수로 가지 않는거 같습니다.

읽어주셔서 감사합니다 샌세

좋아요 1

GetStringSize(const T&) 이므로 T 에 뭐가 와도 const char* 이 될 수 없기 때문입니다.

예를 들어서 T 자리에 char* 가 오면 const char*& 이므로 const char* 과 다릅니다.

그냥 오버로딩으로 해결하려면 간단히 template<> 를 떼버리면 됩니다.