2009-05-16 4 views
2

템플릿 및 구문

은 기본적으로는 표준 : : 목록 같은 것을 통해 루프 (이것은 일반적으로 만들고, 다른 문자열) STL 문자열의 STL 컨테이너보고 최장의 길이를 반환합니다 공통점. 그것은 다음과 같이 파일 목록을 처리이다 :

 
C:\Windows\System32\Stuff.exe 
C:\Windows\Things\InHere.txt 
C:\Windows\Foo\Bar.txt 

이 11을 반환해야한다 "C:\Windows\는"공통이기 때문이다.

전에 templatized 함수를 작성하지 않았으며 제 컴파일러가 불평하고 있습니다. 여기 내 코드는 다음과 같습니다
헤더 :

// longestBegin.h -- Longest beginning subsequence solver 
template <typename SequenceSequenceT, typename SequenceT, typename T > 
size_t longestBegin(InputIterator firstCandidates, InputIterator lastCandidates); 

구현 :

// longestBegin.cpp -- Longest beginning subsequence solver 
#include <stdafx.h> 

template <typename SequenceSequenceT, typename SequenceT, typename T > 
size_t longestBegin(InputIterator firstCandidates, InputIterator lastCandidates) 
{ 
    SequenceT firstString = *firstCandidates; 
    size_t longestValue = firstString.length(); 
    firstCandidates++; 
    for(size_t idx = 0; idx < longestValue; idx++) 
    { 
     T curChar = firstString[idx]; 
     for(InputIterator curCandidate = firstCandidates;curCandidate != lastCandidates; curCandidate++) 
     { 
      if ((*curCandidate)[idx] != curChar) 
       return idx - 1; 
     } 
    } 
    return longestValue; 
} 

내가 내가 여기에 근본적인 뭔가를 누락 재미있는 느낌이 ......

컴파일러 폭탄이 다음 오류와 함께 표시됩니다.

error C2998: 'size_t longestBegin' : cannot be a template definition 

아이디어가 있으십니까? 감사!

빌리 3

+2

여기에 저작권 메시지를 제거하여 코드의 가독성을 높이십시오. –

+0

코드에서 오류 메시지가 나타나는 곳을 표시하십시오. –

+1

그래, 위의 설명을 복사하면 도움이되지 않습니다. –

답변

5

template 행의 매개 변수 이름에는 모든 유형의 함수 매개 변수 또는 반환 유형이 포함되어야합니다. 즉, 템플릿 매개 변수 목록에 InputIterator을 언급해야합니다.


template <typename InputIterator> 
size_t longestBegin(InputIterator firstCandidates, InputIterator lastCandidates) 

당신의 다음 문제는 다음과 같습니다 : 어떻게 컴파일러는 SequenceT이 무엇인지 알 수 있을까에 함수 선언을 변경해보십시오? 대답은 InputIterator의 참조를 취소 한 결과입니다. 포인터가 아닌 반복자는 reference이라는 중첩 된 typedef을 포함하며 여기에 필요한 항목입니다. 컴파일러는 SequenceT가 무엇인지 알 수 있도록 함수의 시작이 추가 :


template <typename InputIterator> 
size_t longestBegin(InputIterator firstCandidates, InputIterator lastCandidates) 
{ 
    typedef typename InputIterator::reference SequenceT; 
[etc.] 

템플릿 매개 변수로 SequenceT을 유지하는 듯하지만 컴파일러는 인수보고에서 무엇인지 추측 할 수 없습니다, 그리고 예를 들어 입력하여 함수를 호출해야합니다. longestBegin<string>(arguments), 여기서는 필요하지 않습니다.

또한 InputIterator이 포인터 인 경우이 기능이 작동하지 않음을 알 수 있습니다. 포인터에는 중첩 된 typedef가 없습니다.그래서 당신은 당신을 위해 이러한 문제를 정렬 할 수 있습니다 그 <iterator> 표준 헤더에서 std::iterator_traits라는 특별한 구조체를 사용할 수 있습니다 : 첫 번째 문자열은 항상 긴 경우를 제외하고


//(At the top of your file) 
#include <iterator> 

template <typename InputIterator> 
size_t longestBegin(InputIterator firstCandidates, InputIterator lastCandidates) 
{ 
    typedef typename std::iterator_traits<InputIterator>::reference SequenceT; 
[etc.] 

마지막으로, 당신은 과거 문자열에 접근 끝낼 수 있었다 그 배열의 끝은 두 번째 for 루프 안에있다. 당신이 그것을 액세스하기 전에 당신은 문자열의 길이를 확인할 수 있습니다


//(At the top of your file) 
#include <iterator> 

template <typename InputIterator> 
size_t longestBegin(InputIterator firstCandidates, InputIterator lastCandidates) 
{ 
    typedef typename std::iterator_traits<InputIterator>::reference SequenceT; 
    SequenceT firstString = *firstCandidates; 
    size_t longestValue = firstString.length(); 
    firstCandidates++; 
    for(size_t idx = 0; idx < longestValue; idx++) 
    { 
     T curChar = firstString[idx]; 
     for(InputIterator curCandidate = firstCandidates;curCandidate != lastCandidates; curCandidate++) 
     { 
       if (curCandidate->size() >= idx || (*curCandidate)[idx] != curChar) 
         return idx - 1; 
     } 
    } 
    return longestValue; 
} 

또한 공통 접두사가없는 경우 함수가 (size_t)(-1)를 반환합니다.

+0

예 .. 그 코드의 논리에 문제가 있습니다 ... 구문이 어떻게 작동 하는지를보기 위해 함께 때 리고있었습니다. 그래도 고마워. :) –

+0

가장 완벽한 대답은 선택 표시. 고맙습니다! –

+0

@Doug : 귀하의 답변이 일부 라인을 놓치고, 템플릿 선언 목록이 불완전하다고 생각합니다. 나는 당신이 그걸 알기를 바랍니다. –

2

신고 템플릿을 전달할 수 없습니다. 구현을 헤더 파일로 옮겨보십시오.

1

먼저 헤더 파일에 구현을 넣어야 할 것 같습니다. 템플릿 함수이고 컴파일시에만 구현 되었기 때문입니다.

+0

답을 뜯어 내지 마십시오. 그러나 "부엌"은 더 빨랐다.) –

1

InputIterator는 내가 생각하는 유형이 아닙니다. 당신은 당신의 코드에서

InputIterator x; 

선언 또는 오류를받을 수 있습니까?

+0

그것은 사실이다. 그러나 내가 묻고있는 실패의 원인이 아니다. –

관련 문제