2016-06-11 5 views
8

이 컴파일 및 Visual C++ 2015 업데이트 3 RC에 잘 실행에서 발견 된 템플릿 멤버 함수에 액세스 할 수 없음 또는 모호함 확인하지 :여러 개의 기본 클래스

이 코드는 두 가지 문제있다
class A 
{ 
    template <class T> void f() {} 
}; 

class B : A {}; 
class C : A {}; 

class D : B, C {}; 

int main() 
{ 
    D d; 
    d.f<int>(); 
} 

:

  1. f()은 비공개이므로 d.f<int>()은 컴파일에 실패합니다.
  2. f()B::f() 또는 C::f() 일 수 있으므로 모호합니다.

그러나 진단에는 /WallB::f()이 호출됩니다. 순서를 반대로하면 D에서 상속받은 C::f()이 호출되므로 목록의 첫 번째 기본 클래스를 사용하고있는 것으로 보입니다.

g ++ 및 clang 모두 올바르게 이해합니다. 뭔가 빠졌거나 Visual C++의 버그입니까?

+1

가장 확실한 버그입니다. http://coliru.stacked-crooked.com/a/6ef1400b04db2ad7 – vsoftco

+0

버그 신고서 제출 : https://connect.microsoft.com? –

+0

@ YuchenZhong 내가 잘못했는지 확인하고 싶다. 그것은 어제부터 아래로 있었다. – isanae

답변

2

이것은 Visual C++의 버그입니다. 2015 년과 2012 년에 재현 할 수 있지만 2005 년에는 재현 할 수 없습니다. bug report on Connect을 개설했습니다. 내가 가진 유일한 해결 방법은 비정상적인 이름을 가질 수 있도록 함수의 이름을 변경하여 우연히 호출 할 수 없도록하는 것입니다.

+0

나는 또한 이것을 2017 RC에서 재현 할 수 있지만 intellisense는 EDG를 사용하기 때문에 squiggle로 플래그를 지정합니다. Intellisense가 실제 컴파일러보다 더 적합 할 때, 그것을 좋아해야합니다. – isanae