Мне нужен тип A , который выдаст свои скрытые данные объекту типа T , но скрыт данные от всех остальных.Мой компилятор C ++ это GCC 4.4, но это не должно иметь значения.Почему это не сработает?
#include <iostream>
template <class T> class A {
private:
int n1;
public:
friend class T;
A(const int n0 = 0) : n1(n0) {}
};
class B {
public:
int f(const A<B> a) const { return a.n1; }
B() {}
};
int main() {
const A<B> a(5);
const B b;
const int m = b.f(a);
std::cout << m << "\n";
return 0;
}
Кстати, это работает нормально, за исключением того, что не удается скрыть данные:
#include <iostream>
template <class T> class A {
private:
int n1;
public:
int n() const { return n1; }
A(const int n0 = 0) : n1(n0) {}
};
class B {
public:
int f(const A<B> a) const { return a.n(); }
B() {}
};
int main() {
const A<B> a(5);
const B b;
const int m = b.f(a);
std::cout << m << "\n";
return 0;
}
Разве C ++ действительно не позволяет классу друга бытьуказан во время компиляции в качестве параметра шаблона?Почему бы и нет?Если нет, то какую альтернативную технику я должен использовать, чтобы скрыть данные?(Можно было бы предпочесть метод компиляции, если это возможно.)
В чем мое недоразумение, пожалуйста?
(я вижу некоторые ответы на смежные вопросы здесь и здесь, но либо они не отвечают на мой конкретный вопрос, либо я не понимаю, что они так делают. Во всяком случае, возможно, я вообще использую неправильную технику. Хотя меня по-прежнему интересует, почему Класс друга T терпит неудачу, я действительно хочу узнать, как скрыть данные, будь то с другом или другими способами.)
Спасибо.