2014-01-10 3 views
1

저는 현재 다른 값의 힘을 보여주는 함수에 대한 템플릿 전문화를 작성하려고합니다. 내 코드는 다음과 같습니다어떻게 C++ 템플릿을 만드시겠습니까?

오류 C2784 :

#include <iostream> 
using namespace std; 
template <class T> 
T myfunc(T x) 
{ 
    return x*x; 
} 
template<> 
string myfunc<string>(string ss) 
{ 
    return (ss+ss); 
} 
int main() 
{ 
cout<<myfunc("test")<<endl; 
return 0; 
} 

컴파일 실패 '표준 : _ String_iterator < _Mystr> 표준 : 운영자 + (_ String_iterator < _Mystr> :: difference_type, 표준 : : _String_iterator < _Mystr>) ' 는 : 템플릿 인수를 추론 할 수없는 에 대한'표준 : _ String_iterator < _Mystr> 표준 : : 문자열 ''에서 '

,

문제가 정확히 어디에서 발생하는지 감지 할 수 있습니까?

+4

' "test"'는'std :: string'으로 추론되지 않습니다. 이것은'const char [5]'유형입니다. – chris

답변

5

char 배열이 아닌 문자열을 함수에 전달해야합니다. Try myfunc(string("test"))

조금 확장하면 - 함수가 호출 될 때 사용할 템플릿/템플릿 전문화의 선택을 템플릿 인수 공제라고합니다.

테스트 유형은 char [5] (끝에 null 문자)이지만 myfunc를 호출하려고합니다. 그러므로 템플릿 인자는 char [5]로 '추론'된다.

종종 char []는 완전히 특수화 된 함수 (템플릿 함수가 아닙니다)에 대한 호출에서 암시 적으로 문자열로 캐스트 될 수 있습니다. 이 암시 적 캐스트는 user1274223이 지적했듯이 std :: string에 서명 문자열 (const char *)이있는 생성자가 있고이 생성자가 이 아니기 때문에 명시 적으로!입니다. 이는 우리가 c 문자열 (char *)을 cplusplus 문자열 (std::string)과 쉽게 바꿔서 사용할 수있는 경우에 유용하지만 이러한 상황에서는 혼동을 줄 수 있습니다.

다른 해결 방법은 myfunc<string>("test")입니다. 여기서는 템플릿 인수가 직접 전달되고 char []는 암시 적으로으로 캐스팅 될 수 있기 때문입니다.

std::string myfunc(const std::string &ss) 
{ 
    return (ss+ss); 
} 

를 호출하는이 방법 myfunct("test")으로 작동합니다 :

+1

string() 구조를 포함하는 경우 +1. "test"는 문자열이 아닌 const char 배열로 해석되므로이 호출이 필요합니다. – Alejandro

+0

명확한 설명에 감사하지만 불행히도 같은 오류가 있습니다. – user3140486

+0

@ user3140486 그것은 나를 위해 owrked, 시도 #include 경우 '+'연산자가 네임 스페이스 – user3125280

1

템플릿 전문성이 경우에 필요하지 않습니다, 당신은 단지 기능에 과부하를해야한다. 함수 템플릿의 특수화는 일반적으로 다른 사람들이 이미 말했듯이 당신이 허브 셔터의 기사 Why Not Specialize Function Templates?

+0

네,하지만 "테스트"의 목적은 OP에 대한 인수가 자신이 원하는 방식으로 추론되고 있다고 생각합니다 – user3125280

+1

std :: string에는 const char *에 대한 생성자가 명시되어야합니다. 리터럴은 문자열로 변환됩니다. – Alejandro

0

에 모습을 가질 수 usefu되지 왜 모든 자세한 내용은

. 뿐만 아니라 , 난 당신이 문자열과 문자열 연산자 +는 자신이 선언 된

#include <string> 

에 당신이 얻을 오류가 다른 모든 연산자를 일치하도록 컴파일러 시도입니다 +에 실패 필요가 있다고 생각합니다.

+0

오, 맞습니다. 감사합니다. :) – user3140486

관련 문제