2011-02-24 3 views
3

하나를 선택하고 반환하기 위해 벡터를 조작하는 함수를 만들고 싶습니다. (. 최선을 선택하는 것이 가리키는 반복자를 반환하는 것)STL 벡터 및 템플릿 함수 문제

좋아, 내 헤더에 여기에이 코드를 가지고 :

class Ecran { // That means Screen in french :P 
    // Other definitions... 

    template<typename T> 
    static T* SelectFrom(vector<T> & v); 
} 

구현 :

template <class T> 
T* Ecran::SelectFrom(vector<T> &v){ 
    int max = v.size(); 
    cout << "Veuillez selectionner un objet parmis les suivants:" << endl << endl; 

    cout << "0) Aucun" << endl; 
    for (int i = 1; i <= max; i++){ 
     cout << i << ") " << v[i-1] << endl; 
    } 

    bool isValid = false; 
    string raw; 
    int input; 
    while (!isValid){ 
     raw = GetWord(); 
     input = atoi(raw.c_str()); 
     if((input >= 0) && (input <= max)){ 
      isValid = true; 
     } 
    } 
    if (input == 0){ 
     return 0; 
    } 
    return & (v[input -1]); 
} 

그래서, 여기 있어요 문제 : 내가 그것을 사용할 때, 컴파일러는 다음과 같이 알려준다 :

'Club * Ecr :: SelectFrom (표준 : : 벡터> &)

나는 그런 식으로 그것을 사용 : 그거야

Club * toDel = Ecran::SelectFrom(_clubs); 

는, 어떤 도움을 크게 감상 할 수있다. 게다가, 이것을 할 수있는 방법이있을 것이지만 T에 대한 포인트 대신 iterator를 리턴 할 것인가?

이미 감사합니다.

+0

헤더 파일이 같은 프로젝트에 있습니까? 이들이 동일한 솔루션을 사용하더라도 다른 프로젝트에서 하나의 프로젝트를 참조해야 할 수도 있습니다. – clamchoda

답변

10

당신이지고있어 문제는 링커 오류입니다, 내가 추측이 있다면 나는 가정 것이다 구현을 .h/.cpp 쌍으로 나눕니다. 일반 C++ 클래스의 경우 올바른 방법이지만 템플릿을 처리 할 때는 구현을 포함한 모든 코드를 헤더 파일에 넣어야합니다.

이 이유는 C++ 컴파일 및 연결 모델 및 템플릿과의 연동 때문입니다. 일반 클래스를 사용하면 컴파일러에서 각 .cpp 파일에 대한 코드를 개별적으로 생성 한 다음 모든 코드를 함께 연결하여 외부 링크를 해결할 수 있습니다. 템플릿에 적용된이 접근 방식의 문제점은 템플릿이 코드가 아니라는 것입니다. 그것들은 코드 패턴이며, 실제 템플릿 자체를 컴파일 할 때 코드가 생성되지 않습니다. 템플릿에 대한 코드는 템플릿이 인스턴스화 될 때만 생성되며,이 경우 인스턴스화 할 코드가 표시되어야합니다. 결과적으로 템플릿 클래스 구현을 포함하는 .cpp 파일을 컴파일하면 템플릿이 실제로 사용될 때 컴파일러에서 해당 코드를 볼 수 없으므로 해당 코드의 인스턴스화가 생성되지 않으므로 링커 오류가 발생합니다 .

+0

정확하게 내 문제가 무엇인지, 빠른 대답에 감사드립니다. –

4

이 함수는 템플릿이므로 해당 정의가 헤더 파일에 있는지 확인하십시오. 반복자, std::vector<T>::iterator보다는 포인터를 반환

: '문제는 있다는 것을

return v.begin() + input - 1; 
+0

아마도'r'을'v.begin()'으로 초기화하고 싶을 것입니다. 그리고 바로 * vector * iterator와 랜덤 액세스가 정의되어 있기 때문에, 아마도 v.begin() + (input-1);을 반환 할 것입니다. " –

+0

@SteveJessop yes. : -S – wilhelmtell