Я хочу типа что даст его скрытую точку привязки к объекту типа 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++ действительно не позволяют друг класса должны быть указаны во время компиляции в качестве параметра шаблона? Почему нет? Если нет, то какую альтернативную технику я должен использовать, чтобы скрыть привязку? (Можно было бы, по возможности, предпочесть технику компиляции).
Каково мое недоразумение здесь, пожалуйста?
(Я вижу некоторые ответы на связанные вопросы here и here,, но либо они не отвечают на мой конкретный вопрос, либо я не понимаю, что они это делают. Во всяком случае, возможно, я использую неправильную технику вообще. остаются заинтересованы в том, почему класс друга T не удается, что я действительно хочу знать, так это, как скрыть данные, как с другом, так и с помощью других средств.)
Спасибо.
Хороший совет. Если я не смогу придумать что-то лучше, я должен следовать совету. Спасибо. – thb
Также ознакомьтесь с идиомой passkey, предложенной Xeo, а также идиомой Адвокат-Клиент. Прошло некоторое время с тех пор, как я прочитал об этом, поэтому мое решение вполне может быть вариантом этих идиом. –