2012-03-21 2 views
1

잘 못된 구식 코드에 새로운 기능을 추가해야합니다. 화면에 표시하고 처리해야하는 50 가지 목록이 있으며, 현재 코드는 모두 2 가지 유형 (DAO 데이터베이스의 목록과지도의 다른 목록)의 사소한 수정으로 모두 잘라내어 붙여 넣기됩니다.다른 값 유형을 가진 맵을 C++의 함수에 전달

필자는 기능을 제공하는 검색 클래스와 검색에 필요한 기본 기능을 제공하는 각 목록 유형의 도우미 클래스를 작성했습니다. 지도 도우미 클래스는 tstring Key에 대한 액세스 만 필요로하며 다른 Object 값은 필요하지 않습니다. 그러나 나는 이것을 컴파일 할 수 없다.

다양한 서로 다른 개체가 관계가 없기 때문에 기본적으로 비어있는 SearchValue 클래스를 정의하고 모든 다른 개체 클래스의 수퍼 클래스로 .h에 추가했습니다. 일례로서

여기지도 정의 중 하나이고 :

class MyPatListEntry : public SearchValue { 

및 I의 함수로서 정의 :

typedef map<tstring, MyPatListEntry *, tstringcomp> patlist; 

MyPatListEntry이 정의

ListHelper(map<tstring, SearchValue *> *map, CString fieldName) 

컴파일러 (VC++)는 ListHelper()에 대한 정의가 모든 인수를 처리하지 못한다는 오류를 제공합니다. 정의에서 SearchValue를 MyPatListEntry로 바꾸면 컴파일이 작동하므로 기본 형식이 정확합니다.

저는이 사이트를 둘러 보았고 이러한 유형의 기능 템플릿을 제안하는 사람들이 작동한다고 생각했지만이 방법으로 작동하지 않는 이유가 있는지 궁금합니다.

아무쪼록 고맙습니다.

+0

'MyPatListEntry'가'SearchValue' 타입이지만'map '는 'map '타입이 아닙니다. – Dialecticus

답변

3

공변 일반 형식 매개 변수은 C#에서 사용할 수 없으며 (C++에서는 가능하지 않음) 심지어 사용자 환경에서는 작동하지 않습니다. 이유는 실제로 아주 간단합니다. 당신 때문에이 문제의 매개 변수로 myMapmyFunc를 호출 할 수 없습니다

class B {}; 
class D1 : public B {}; 
class D2 : public B {}; 

map<string, D1 *> myMap; 
D2 someObject; 

void myFunc(map<string, B *> & someMap) 
{ 
    someMap["foo"] = &someObject; 
} 

:

다음 코드를 상상해보십시오. D2 유형의 someObjectD1이 포함 된 것으로 지정할 수 있습니다.

+0

C#에서 가능합니까? –

+0

좋은 지적입니다. "void myFunc (const map & someMap)"이라면 어떨까요? – russell

+0

@David C#에서는 일부 제네릭 형식 매개 변수를 _input_ 또는 _output_만으로 제한 할 수 있습니다. 예를 들어, 일부 기본 맵을 검사 할 때만 사용할 수있는'MapReader '일반 인터페이스를 가질 수 있습니다. 출력 매개 변수로만 MapReader에서 이러한 유형의 매개 변수 객체를 만들거나 복사하거나 수락 할 수 없으므로'MapReader '를'MapReader '로 암시 적으로 변환 할 수 있습니다. – Fiktik

0

당신이 정말로 다른 SearchValue 종류 이상의 서로 다른 동작을 할 ListHelper을해야하는 경우가 맵의 값 형을 통해 기능을 템플릿에 적합 할 수 있습니다 :

template <class AnySearchValue> ListHelper(map<tstring, AnySearchValue *> *map, CString fieldName) 

그것은 그 보지 않고 실행할 수 있는지 말하기 어렵다 그러나 더 많은 구현. (죄송합니다, 당신이 당신이 이것을 좋아할 거라고 말한 OP에서 빠졌습니다)