Как скрыть датум от всех, кроме класса T

Мне нужен тип A, который передаст свои скрытые данные объекту типа T, но скроет данные от всех остальных. Мой компилятор C++ — GCC 4.4, но это не имеет значения. Почему это не сработает?

#include 

template  class A {
  private:
    int n1;
  public:
    friend class T;
    A(const int n0 = 0) : n1(n0) {}
};

class B {
  public:
    int f(const A a) const { return a.n1; }
    B() {}
};

int main() {
    const A a(5);
    const B b;
    const int m = b.f(a);
    std::cout << m << "\n";
    return 0;
}

Между прочим, это прекрасно работает, за исключением того, что не удается скрыть датум:

#include 

template  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 a) const { return a.n(); }
    B() {}
};

int main() {
    const A a(5);
    const B b;
    const int m = b.f(a);
    std::cout << m << "\n";
    return 0;
}

Действительно ли C++ не позволяет указывать дружественный класс во время компиляции в качестве параметра шаблона? Почему нет? Если нет, то какую альтернативную технику следует использовать, чтобы скрыть датум? (Если возможно, можно было бы предпочесть метод времени компиляции.)

В чем тут мое недоразумение, пожалуйста?

(Я вижу некоторые ответы на связанные вопросы здесь и здесь , но либо они не отвечают на мой конкретный вопрос, либо я не понимаю, что они делают это. Во всяком случае , может быть, я вообще использую неправильную технику.Хотя меня по-прежнему интересует, почему класс друга Tтерпит неудачу, я действительно хочу знать, как скрыть данные, будь то с помощью друга или другими способами. )

Спасибо.

5
задан Community 23 May 2017 в 12:20
поделиться