Witam, to jest kod przepisany ze wspomnianej książki z listingu 14.22 :
szablon klasy:
#ifndef FRND2TMP_H_
#define FRND2TMP_H_
#include <iostream>
using std::cout;
using std::endl;
template <typename T>
class HasFriend {
private:
T item;
static int ct;
public:
HasFriend(const T& i) : item(i) { ct++; }
~HasFriend() { ct--; }
friend void counts();
friend void reports(HasFriend<T>&);
};
//statyczna składowa dla każdej specjalizacji
template <typename T> int HasFriend<T>::ct = 0;
//funkcja zaprzyjaźniona ze wszystkimi klasami HasFriend<T>
void counts() {
cout << "Konkretyzacje int: " << HasFriend<int>::ct << "; ";
cout << "Konkretyzacje double: " << HasFriend<double>::ct << endl;
}
//funkcje zaprzyjaźnione dla konkretnych konkretyzacji
void reports(HasFriend<int>& hf) {
cout << "HasFriend<int>: " << hf.item << endl;
}
void reports(HasFriend<double>& hf) {
cout << "HasFriend<double>: " << hf.item << endl;
}
#endif
Użycie w innym pliku:
#include <iostream>
#include "frnd2tmp.h"
void main10() {
using std::cout;
using std::endl;
cout << "Brak zadeklarowanych obiektow: ";
counts();
HasFriend<int> hfi1(10);
cout << "Po deklaracji hfi1: ";
counts();
HasFriend<int> hfi2(20);
cout << "Po deklaracji hfi2: ";
counts();
HasFriend<double> hfdb(10.5);
cout << "Po deklaracji hfdb: ";
counts();
reports(hfi1); // 1
reports(hfi2); // 2
reports(hfdb); // 3
}
Ostateczne wywołanie void main10() jest oczywiście w funkcji int main().
Ostatnie wywołania funkcji zaprzyjaźnionej reports() zaznaczyłem jako 1, 2, 3. Bo tu kompilator daje mi taki błąd: "więcej niż jedno wystąpienie elementu funkcja przeciążona "reports" jest zgodne z listą argumentów"
Nie rozumiem dlaczego :/ Przecież mam w definicjach ładnie napisane specjalizacje tej funkcji:
void reports(HasFriend<int>& hf) {
cout << "HasFriend<int>: " << hf.item << endl;
}
void reports(HasFriend<double>& hf) {
cout << "HasFriend<double>: " << hf.item << endl;
}
W książce pisze że niektóre kompilatory ostrzegają o próbie stosowania nieszablonowych funkcji zaprzyjaźnionych, ja za to mam błąd...
Korzystam z visual studio 2017, ja coś źle zrobiłem czy po prostu wiele kompilatorów nie toleruje już takich konstrukcji w ogóle ? ( o ile w książce piszę tylko o ostrzeganiu ). Z góry wam dziękuje za pomoc.