非表示のデータをタイプTのオブジェクトに生成するが、データを他のすべてのオブジェクトから非表示にするタイプAが必要です。私のC++コンパイラはたまたまGCC4.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が失敗する理由、私が本当に知りたいのは、友達と一緒であろうと他の手段であろうと、データを非表示にする方法です。)
ありがとう。