我想要一个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失败,我真正想知道的是如何隐藏数据,无论是与朋友还是通过其他方式。)
谢谢。