Warum ist es in C ++ nicht möglich, eine Template-Klassenmitgliedsfunktion mit dem Template-Typ einer anderen Klasse zu befreunden?

Mit anderen Worten, warum funktioniert diese Kompilierung gut:

template<typename Type>
class A{
  public:
    void f();
};

class B{
  friend void A<int>::f();
};

template<>
void A<int>::f(){
  B* var = new B();
}

Während dies nicht der Fall ist:

template<typename Type>
class A{
  public:
    void f();
};

template<typename Type> // B is now a templated class
class B{
  friend void A<Type>::f(); // Friending is done using B templated type
};

template<>
void A<int>::f(){
  B<int>* var = new B<int>(); // var is now declared using int as its templated type
}

Für das zweite Code-Snippet sagt der Compiler (gcc 6.2, keine speziellen Flags):

main.cpp: In instantiation of ‘class B<int>’:
main.cpp:14:28:   required from here
main.cpp:9:15: error: prototype for ‘void A<int>::f()’ does not match any in class ‘A<int>’
   friend void A<Type>::f();
               ^~~~~~~
main.cpp:13:6: error: candidate is: void A<Type>::f() [with Type = int]
 void A<int>::f(){

Wie ich es verstehe, sollte der Compiler beim Deklarieren von var im zweiten Codefragment die Deklaration der Klasse B analysieren, den in der Friend-Deklaration verwendeten Typ durch int ersetzen und alles sollte gut funktionieren. Was vermisse ich

EDIT: Kommentare unten haben darauf hingewiesen, dass das zweite Code-Snippet mit clang und Visual C ++ 2015 @ korrekt zu kompilieren schein

Antworten auf die Frage(4)

Ihre Antwort auf die Frage