2013-07-16 2 views
1

내 C++/CLI 코드에는 약 20 개의 클래스가 있습니다. 나는 print 함수를 20 번 오버로드하여 각 클래스의 인스턴스를 처리했습니다. 이제는 20 개 클래스 각각의 객체 배열을 추가로 지원해야하며 서로 거의 중복되지 않는 20 개의 오버로드를 작성해야합니다. 예를 들어, 아래 참조 : 다음과 같은 오류에제네릭 함수에서 배열 <> 사용

void print(int i){ 
    Console::WriteLine("Integer: {0}", i); 
} 

void print(String ^s){ 
    Console::WriteLine(L"Hello " + s); 
} 

generic <typename T> 
void print(array<T> ^ts){ 
    for(int i = 0, n = ts->Length; i < n; ++i) 
    print(ts[i]); 
} 

int main(array<System::String ^> ^args) 
{ 
    array<String^> ^s = gcnew array<String^>{ L"apple", L"ball", L"car" }; 
    print(s); 
    Console::WriteLine(L"Hello World"); 
    return 0; 
} 

그러나 위의 결과 :

error C2665: 'print' : none of the 2 overloads could convert all the argument types 

왜 이런 일이 컴파일하지 않습니다? 내가하려고하는 것에 대한 대안은 무엇입니까?

+0

당신이 그것을 어떻게 전화를 했습니까? –

+0

@ LightnessRacesinOrbit, 호출 기능 (주)을 포함하도록 코드를 업데이트했습니다 –

+0

고마워요. 그것은 매우 중요합니다. –

답변

1

컴파일되지 않는 이유는 가능한 모든 유형에 대해 템플릿 메서드와 달리 일반 메서드가 존재하기 때문입니다. 템플릿 메서드는 호출 될 때 만들어집니다. 문자열 배열로 print 만 호출하기 때문에 템플릿 메서드 정의는 문자열 배열을 명시 적으로 취하는 버전을 컴파일하고 다른 것은 컴파일하지 않습니다. print(String^) 메서드를 호출하기 위해 구현 될 것이므로 오류가 발생하지 않습니다.

일반이기 때문에 컴파일 된 버전의 메소드는 하나뿐입니다. T을 다른 메소드에 전달하면 매개 변수를 사용하여 프로그램에서 사용하지 않는 것보다 많은 메소드가 오버로드되어야합니다. 이 메소드의 경우 T을 메소드에 전달하려는 경우 Object^ 유형의 매개 변수를 가져야합니다.

이 작업을 수행하려면 print을 구현하여 Object를 사용하고 반사를 사용하여 인쇄 할 클래스 이름을 찾으십시오.

void print(Object^ o) 
{ 
    Console::WriteLine("{0}: {1}", o->GetType()->Name, o); 
} 

generic <typename T> 
void print(array<T> ^ts){ 
    for(int i = 0, n = ts->Length; i < n; ++i) 
    print(ts[i]); 
} 

당신이 특정 유형의 특정 버전을 제공하는 인쇄 방법에 몇 가지 추가 로직을 구현하려면

:

void print(Object^ o){ 
    if(o->GetType() == String::typeid) 
    Console::WriteLine("Hello {0}", o); 
    else 
    Console::WriteLine("{0}: {1}", o->GetType()->Name, o); 
} 

generic <typename T> 
void print(array<T> ^ts){ 
    for(int i = 0, n = ts->Length; i < n; ++i) 
    print(ts[i]); 
} 
2

가 컴파일 할 수없는 이유는 더 print<T> 기능이 없다는 것입니다. print 함수는 intString입니다.

C++ 템플릿 작동합니다 :

template <class T> 
void print(array<T> ^ts){ 
    for(int i = 0, n = ts->Length; i < n; ++i) 
    print(ts[i]); 
} 
관련 문제