Почему в C ++ невозможно подружить функцию-член класса шаблона, используя тип шаблона другого класса?
Другими словами, почему это хорошо скомпилируется:
template<typename Type>
class A{
public:
void f();
};
class B{
friend void A<int>::f();
};
template<>
void A<int>::f(){
B* var = new B();
}
Пока это не так:
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
}
Для второго фрагмента кода компилятор (gcc 6.2, без специальных флагов) говорит:
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(){
Насколько я понимаю, во втором фрагменте кода при объявлении var компилятор должен проанализировать объявление класса B, заменить тип, используемый в объявлении друга, на int, и все должно работать нормально. Что мне не хватает?
РЕДАКТИРОВАТЬ: комментарии ниже указали, что второй фрагмент кода, кажется, правильно компилируется с Clang и Visual C ++ 2015