Błąd kompilatora języka C++ podczas mieszania szablonów wariancji i funkcji znajomego

Dotyczy
Visual Studio 2015

Objawy

Podczas próby zadeklarowania szablonu funkcji wariancji jako przyjaciela szablonu klasy, kompilator języka C++ zwróci komunikat o błędzie zamiast zaakceptować kod. Na przykład po wykonaniu następującej deklaracji:


template<typename T>
struct B { };

template<typename... Types>
struct C { };

template<typename... Types, typename U>
void f(C<Types...>, B<U>)
{
}

template<typename T>
class A {
	template<typename... Types, typename U>
	friend void f(C<Types...>, B<U>);
};

int main()
{
    f(C<int>{}, B<int>{});
    A<int> a{};
};

Może zostać wyświetlony następujący komunikat o błędzie:

Uwaga

błąd C2783: "void f(<C Types...>,B<U>)": nie można wydedukować szablonu argumentu dla "U"

Przyczyna

Przyczyną jest to, że kompilator języka C++ nie może dopasować deklaracji funkcji friend do istniejącej deklaracji.

Rozwiązanie

Ta aktualizacja jest dostępna w Centrum pobierania Microsoft.

Centrum pobierania Microsoft

Aby uzyskać więcej informacji dotyczących sposobów pobierania plików pomocy technicznej firmy Microsoft, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Baza wiedzy Microsoft Knowledge Base:

119591 Jak uzyskać pliki pomocnicze firmy Microsoft w usłudze Usługi online

Firma Microsoft przeskanowała ten plik w poszukiwaniu wirusów. Firma Microsoft użyła najnowszego oprogramowania do wykrywania wirusów, które było dostępne w dniu opublikowania pliku. Plik jest przechowywany na serwerach z rozszerzonymi zabezpieczeniami, które pomagają zapobiegać nieautoryzowanym zmianom w pliku.

Wymagania wstępne

Ta poprawka wymaga aktualizacji Visual Studio 2015 Update 3.

Informacje o ponownym uruchamianiu

Po zastosowaniu tej poprawki może być konieczne ponowne uruchomienie komputera.

Informacje o wymianie

Ta poprawka nie zastępuje żadnej wcześniej wydanej poprawki.

Informacje o plikach

Angielska wersja tej poprawki ma atrybuty pliku (lub nowsze atrybuty pliku) wymienione w poniższej tabeli. Daty i godziny dla tych plików są wyświetlane według uniwersalnego czasu koordynowanego (UTC). Informacje o pliku są konwertowane na czas lokalny. Aby znaleźć różnicę między czasem UTC a czasem lokalnym, użyj karty Strefa czasowa w elemencie Data i godzina w Panelu sterowania.

Nazwa pliku Wersja pliku Rozmiar pliku Data Godzina Platforma
VC14-KB4096429.exe 14.0.24240 19,177,304 04/19/2018 02:32 X86

Obejście

Aby obejść ten problem, nie należy deklarować szablonu funkcji wariancji jako znajomego szablonu klasy.