, neden bu ince derliyor:C++ 'da, neden başka bir sınıfın şablon türünü kullanarak bir şablon sınıf üyesi işlevine arkadaşlık etmek mümkün değildir? Başka bir deyişle
template<typename Type>
class A{
public:
void f();
};
class B{
friend void A<int>::f();
};
template<>
void A<int>::f(){
B* var = new B();
}
bu değil iken:
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
}
ikinci kod parçacığı, derleyici (gcc 6.2, hiçbir özel bayraklar) için diyor ki:
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(){
Anladığım kadarıyla, ikinci kod snippet'inde, derleyici bildirimde bulunulduğunda, derleyici B sınıfı bildirimini ayrıştırmalı, arkadaşta kullanılan Türü değiştir int tarafından beyan ve her şey iyi çalışmalıdır. Neyi kaçırıyorum?
DÜZENLEME: aşağıdaki yorum ikinci kod parçacığı uzmanlaşmış olmadan clang ve Visual C++ 2015
sadece FYI. clang – Hayt
ile derlemek gibi görünüyor Ayrıca burada deneyebilirsiniz gibi Visual C++ 2015 ile derler: http://webcompiler.cloudapp.net/ – Tunichtgut
Hem clang 3.8 ve gcc 6.1.0 çalışır [Demo] (http: // coliru.stacked-crooked.com/a/14434a24d4688733) – Jarod42