2016-06-11 42 views
8

Questo compila e funziona bene su Visual C++ 2015 Update 3 RC:Nessun accesso o ambiguità controllo sulla funzione di membro template trovato in più classi base

class A 
{ 
    template <class T> void f() {} 
}; 

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

class D : B, C {}; 

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

Ci sono due problemi con questo codice:

  1. f() è privato, quindi d.f<int>() non dovrebbe riuscire a compilare.
  2. f() è ambiguo, come potrebbe essere B::f() o C::f().

Tuttavia, non è disponibile alcuna diagnostica con /Wall e B::f(). L'inversione dell'ordine D eredita da gets C::f() chiamato, quindi suppongo che stia usando solo la prima classe di base nell'elenco.

Sia g ++ che clang vanno bene. Mi manca qualcosa o si tratta di un bug in Visual C++?

+1

Certamente un bug. http://coliru.stacked-crooked.com/a/6ef1400b04db2ad7 – vsoftco

+0

Considera di inviare una segnalazione di bug qui: https://connect.microsoft.com? –

+0

@YuchenZhong Volevo solo controllare se avevo qualcosa di sbagliato. Comunque è passato da ieri. – isanae

risposta

2

Questo è un bug con Visual C++. Posso riprodurlo nel 2015 e nel 2012, ma non nel 2005. Ho aperto uno bug report on Connect. L'unico rimedio che ho è di rinominare la funzione per avere un nome insolito in modo che non possa essere chiamato accidentalmente.

+0

Posso anche riprodurlo su 2017 RC, ma intellisense lo contrassegna con uno scarabocchio perché usa EDG. Devi amarlo quando intellisense è più conforme del compilatore vero e proprio. – isanae