2015-01-31 5 views
-1

함수 전문화 문제가 발생했습니다. 내가 is<char **>(tab, n)으로 함수를 호출 할 때함수 특수화가 작동하지 않습니다.

template <class type> 
void is(type tab, int n) { 
    string key; 
    int i, j; 

    for(i=1; i<n; i++){ 
     key=tab[i]; 
     j=i-1; 
     while(j>=0 && tab[j]>key){ 
      tab[j+1]=tab[j]; 
      j--; 
     } 
     tab[j+1]=key; 
     } 
    } 

template <> 
void is <char **> (char *tab[], int n){ 
    char* key; 
    int i, j; 

    for(i=1; i<n; i++){ 
     key=tab[i]; 
     j=i-1; 
     while(j>=0 && strcmp(tab[j], key)>0){ 
      tab[j+1]=tab[j]; 
      j--; 
     } 
     tab[j+1]=key; 
    } 
} 

내가 정확 해요 경우, 프로그램은 전문성을 사용해야합니다. 그렇다고하더라도 나는 그것을 컴파일 할 수 없다. 내가받는 것은 sort.cpp:(.text+0x0): multiple definition of void is<char**>(char**, int)입니다. 주어진 도움에 정말 감사 할 것입니다.

+0

정의 또는 호출에'is '이 필요하지 않습니다. 단지'template <> void is (char * tab [], ...)'이 좋습니다. 그러나 코드는 문법적으로 잘 보입니다. 여러 개의 .cpp 파일에 사용되는 헤더에 코드를 정의하고 있습니까? – Barry

+0

또한 함수를 전혀 전문으로하지 않으므로 과부하 일뿐입니다. void is (char * tab [], int n) {..}'. 과부하가 더 간단합니다. – Barry

+0

[전문화에는 문제가 없습니다.] (https://ideone.com/Vtw6im). –

답변

0

두 번째 is은 더 이상 템플릿이 아니기 때문에 완전히 전문화되어 있기 때문에 템플릿 전문화와 관련하여 많은 문제가있는 것은 아닙니다.

템플릿은 여러 번역 단위로 정의 될 수 있지만 일반 기능은 여러 번 정의되지 않을 수 있습니다.

@Barry는 솔루션에 가까워 지지만 원본 템플릿은 전문화가 아닌 inline 일 필요는 없다는 사실을 잊어 버립니다.

이 이전의 모든 기능과 같은 두 가지 솔루션 리드 (기억 전문화 오래된 기능입니다) :

template <> void is <char **> (char *tab[], int n); 
// definition in *one* .cpp file 

template <> 
inline void is <char **> (char *tab[], int n){ 
    /* ... */ 
} 

그러나

, function template specialization is tricky and should often be avoided in favor of overloading.