2009-07-29 4 views
0

은 템플릿 기반 클래스에서 파생 된 C++/CLI에서 B입니다. 의 인스턴스가 있고 그 인스턴스에서 메서드를 호출하려고하는 C# 코드가 있습니다. 메서드가 A에 구현 된 경우 모두 정상입니다. B에 구현 된 경우 이상하게 보입니다.템플릿 기반 C++/CLI 기본 클래스의 C#에서 메서드 호출

C++/CLI를 :

나는 내가 뭘하려고 오전 보여주는 간단한 코드를 노크

 
template<typename T> 
public ref class B 
{ 
public: 
    void Test(){} 
};

public ref class A : public B<System::Int32> { };

C 번호 :이 테스트 코드에서

 
    A a = new A(); 
    a.Test(); 

, Test()에 대한 호출 컴파일하지 않습니다 ("테스트"에 대한 정의가 없습니다). Test()을 정적으로 수정하면 동일한 결과가 나타납니다 (인스턴스가 아닌 A). 그것이 그 이야기의 끝 부분이라면 나는 단지 마이크로 소프트에게 나의 주먹을 흔들고 그것과 함께 살 것이다.

그러나 실제 코드에는 Test()에 해당하는 기능이 있습니다! 기괴한 것은 한 가지 경우에만 작동합니다. 작업 방법을 복사하고 이름을 변경하면 새 방법에 다시 도달 할 수 없습니다.

다른 곳에서 가져온 이름을 제외하려면 작업 방법을 제거해 보았습니다. 코드가 예상대로 빌드되지 않습니다.

나는 아직도 내가보고있는 것이 결함이고 내가하려는 것은 지원되지 않는다고 생각합니다. 그러나 나는 그것을 배제하는 어떠한 참고 문헌도 발견 할 수 없기 때문에 내가 바라는 이상 현상과 함께 내가 무엇을 기대해야 하는지를 확실히 알고 싶다.

답변

2

일반 C++에서 템플릿 기반 클래스 메서드는 실제로 연결 범위 내에서 사용되는 경우에만 인스턴스화됩니다. C + + 어셈블리에서 사용되지 않는 경우 C++/CLI 구현이 Test()에 대한 코드를 생성하지 않는 것으로 생각할 수 있습니다.

+0

사용해보십시오. 당신이 그것에 대해 생각할 때 아주 분명합니다. 이제 그 문제를 해결할 수 있습니다. 신속한 답변 주셔서 감사합니다. – philsquared

-1

귀하의 질문에 대한 답변은 실제로 매우 간단합니다. 혼합 어셈블리 -C++/CLI를 컴파일하면 컴파일러가 어셈블리 외부에서 원시 함수를 내보내고 해당 어셈블리의 메타 데이터를 출력하는 몇 가지 규칙이 있습니다.

명시 적으로 지정하지 않으면 네이티브 메서드가 어셈블리에서 노출되지 않는다는 것 중 하나입니다. 메타 데이터를 통해 노출 할 원시 메소드를 명시 적으로 지정하려면 #pragma make_public(Your Class Here)을 사용하십시오.

다른 하나는 템플릿 함수가 어셈블리 밖으로 노출 될 수 없다는 것입니다. 그래서 귀하의 경우에는 템플릿 클래스를 노출 할 수 없습니다.

그러나 귀하의 경우에는 템플릿 클래스가 필요 없다는 사실이 거의 확실하지만 일반적으로 내보낼 수있는 일반적인 템플릿입니다.

왜 템플릿이 필요합니까? 템플릿 <>과 일반 <>의 차이점을 이해하고 있습니까? 하나는 컴파일 시간 단위이고 다른 하나는 런타임입니다.

이것은 :-) I에 유래를 사랑하는 이유 * 정확히 * 무슨 일이 일어나고 있는지의

generic<class T> 
public ref class B 
{ 
public: 
    void Test(){} 
}; 


public ref class A : public B<System::Int32> 
{ 
}; 
+0

코드에 원시 메소드가 없습니다. 두 클래스 모두'ref'이므로 모든 코드가 관리됩니다. –

+0

귀하의 의견을 보내 주셔서 감사합니다, Ivan. 분명히 예제는 내가 템플릿을 가지고 무엇을하려고 하는지를 나타내는 것이 아닙니다. 여기에서 템플릿을 사용하여 컴파일 결과를 얻으려고합니다. 나는 generics로 같은 것을 달성 할 수 없다. 나는 이것이 받아 들여지는 데 필요한 모든 것이 답답한 것 같다. – philsquared

관련 문제